Servers 分类中的最新日记

Google的OpenID

| 评论(24) | 引用通告(2)
上次写了Windows Live ID当作OpenID使用的方法,这次写Google的OpenID的实现方法。

if(empty($_REQUEST['openid_mode'])){
$openid_server = getXrdsUri('https://www.google.com/accounts/o8/id');
$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
$data['openid.mode'] = 'associate';
$data['openid.assoc_type'] = 'HMAC-SHA1';
$data['openid.session_type'] = 'no-encryption';
$AssocHandle = getAssociationHandle($openid_server.'?'.http_build_query($data));
setcookie('cookieAssocHandle', $AssocHandle);
unset($data);

$data['openid.ns'] = 'http://specs.openid.net/auth/2.0';
$data['openid.claimed_id'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$data['openid.identity'] = 'http://specs.openid.net/auth/2.0/identifier_select';
$data['openid.return_to'] = $AuthUrl;
$data['openid.realm'] = $RealmUrl;
$data['openid.assoc_handle'] = $AssocHandle;
$data['openid.mode'] = 'checkid_setup';
$data['openid.ns.ext1'] = 'http://openid.net/srv/ax/1.0';
$data['openid.ext1.mode'] = 'fetch_request';
$data['openid.ext1.type.email'] = 'http://axschema.org/contact/email';
$data['openid.ext1.required'] = 'email';

$LocationUrl = $openid_server.'?'.http_build_query($data);
}else{
if('id_res' == $_REQUEST['openid_mode']
&& $AssocHandle == $_REQUEST['openid_assoc_handle']){
$openid = !empty($_REQUEST['openid_ext1_value_email']) ? $_REQUEST['openid_ext1_value_email'] : formUrl($_REQUEST['openid_claimed_id']);
$email = $_REQUEST['openid_ext1_value_email'];
}
echo('<pre>');
echo("<a href=$LoginUrl>BACK</a>\n\n");
print_r($_REQUEST);
echo('</pre>');
}

function getAssociationHandle($url){
$c = curl_init($url);

curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_HEADER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);

$contents = curl_exec($c);
//print_r($contents);
//exit;

curl_close($c);

$assoc_handle = time();

$lines = explode("\n", $contents);

foreach($lines as $line){
if(substr($line, 0, 13) == "assoc_handle:"){
$assoc_handle = substr($line, 13);
break;
}
}

return $assoc_handle;
}

function getXrdsUri($url){
$c = curl_init($url);

curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
curl_setopt($c, CURLOPT_HEADER, false);
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);

$request_contents = curl_exec($c);

curl_close($c);

$domdoc = new DOMDocument();
$domdoc->loadXML($request_contents);

$uri = $domdoc->getElementsByTagName("URI");
$uri = $uri->item(0)->nodeValue;

return $uri;
}

if(empty($openid))
LocationHtml($LocationUrl);

LocationHtml函数见Windows Live ID当作OpenID使用的方法

注意:Google的OpenID的openid.claimed_id(即OpenID)的值,随不同网站变化,网站不同值也不同,所以不是真正的OpenID,Google真正的OpenID是他的Email。但是Email也不是每次都可以取得到的,如果你在Google的授权页面上点选了"允许 XXX 记住我",再次登录时将略过授权页面,同时也将得不到Email的值。只有Google帐号的所有者在个人设置里更改获授权网站,将你的网站撤销访问权,才能再次得到Email的值。

Google的OpenID是个被阉割的OpenID,除了提供Email的值之外,其他一概不提供!

参考:http://code.google.com/intl/zh-CN/apis/accounts/docs/OpenID.html

Apache2.2自签名SSL认证

# mkdir -m 700 /usr/local/etc/apache22/ssl.crt
# mkdir -m 700 /usr/local/etc/apache22/ssl.csr
# mkdir -m 700 /usr/local/etc/apache22/ssl.key
# cd ~
# openssl req -new -x509 -nodes -out server.crt -keyout server.key
当要求输入主机名时,输入正确的域名。(Common Name put the hostname (fully qualified domain name) of your computer.)

# cp server.crt /usr/local/etc/apache22/ssl.crt/server.crt
# cp server.key /usr/local/etc/apache22/ssl.key/server.key
# chmod 400 /usr/local/etc/apache22/ssl.crt/server.crt
# chmod 400 /usr/local/etc/apache22/ssl.key/server.key

# ee /usr/local/etc/apache22/httpd.conf
把#Include etc/apache22/extra/httpd-ssl.conf前面的#去掉。

# ee /usr/local/etc/apache22/extra/httpd-ssl.conf
设置正确的SLCertificateFile,SSLCertificateKeyFile

# apachectl configtest
# apachectl restart

https://域名/

注意:自签名的SSL证书会有认证提示的,购买的就没有提示了!

参考:http://lamp.linux.gov.cn/Apache/ApacheMenu/ssl/ssl_faq.html#aboutcerts

rpxnow.com的OpenID托管服务

| 评论(2)


RPX提供了OpenID的托管服务,你所要做的,只是在网页中插入几行代码,剩下的全部由它来完成。

但是RPX提供的PHP示例代码,我想很多人未必会用,写的有点菜,我就没有用的起来。下面是我自己写的一个示例代码,供大家学习:)

<script src="https://rpxnow.com/openid/v2/widget"
type="text/javascript"></script>
<script type="text/javascript">
RPXNOW.token_url = "http://freebapp.org/tools/openid/rpx.php";
RPXNOW.realm = "freebapp";
RPXNOW.overlay = true;
RPXNOW.language_preference = 'en';
</script>

<?php
if(!empty($_REQUEST['token'])){
$post['token'] = $_REQUEST['token'];
$post['apiKey'] = 'a21e795ea614c12f549660ab15f93de30451d338';
$post['format'] = 'json';

$curl = curl_init();
$url = 'https://rpxnow.com/api/v2/auth_info?token_url='.urlencode('http://freebapp.org/tools/openid/rpx.php');
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_HEADER, 0);
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_URL, $url);

$data = curl_exec($curl);
echo('<pre>');
print_r(json_decode($data));
echo('</pre>');
curl_close($curl);
}
?>

大家把上例的apiKey和token_url换成自己的就可以了!

示例演示

JSON和XML,怎么选

| 评论(1)
同样是跨平台的数据交换格式,您是选择JSON还是XML?

一定是JSON,轻量级的数据交换格式,JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。

XML多余的HTML代码太多了,很臃肿,不好。

http://www.json.org/json-zh.html

FreeBSD 7.0-r

# cd /usr/ports/security/nmap && make install clean
# nmap --help
Nmap 4.76 ( http://nmap.org )
Usage: nmap [Scan Type(s)] [Options] {target specification}
TARGET SPECIFICATION:
Can pass hostnames, IP addresses, networks, etc.
Ex: scanme.nmap.org, microsoft.com/24, 192.168.0.1; 10.0.0-255.1-254
-iL <inputfilename>: Input from list of hosts/networks
-iR <num hosts>: Choose random targets
--exclude <host1[,host2][,host3],...>: Exclude hosts/networks
--excludefile <exclude_file>: Exclude list from file
HOST DISCOVERY:
-sL: List Scan - simply list targets to scan
-sP: Ping Scan - go no further than determining if host is online
-PN: Treat all hosts as online -- skip host discovery
-PS/PA/PU [portlist]: TCP SYN/ACK or UDP discovery to given ports
-PE/PP/PM: ICMP echo, timestamp, and netmask request discovery probes
-PO [protocol list]: IP Protocol Ping
-n/-R: Never do DNS resolution/Always resolve [default: sometimes]
--dns-servers <serv1[,serv2],...>: Specify custom DNS servers
--system-dns: Use OS's DNS resolver
SCAN TECHNIQUES:
-sS/sT/sA/sW/sM: TCP SYN/Connect()/ACK/Window/Maimon scans
-sU: UDP Scan
-sN/sF/sX: TCP Null, FIN, and Xmas scans
--scanflags <flags>: Customize TCP scan flags
-sI <zombie host[:probeport]>: Idle scan
-sO: IP protocol scan
-b <FTP relay host>: FTP bounce scan
--traceroute: Trace hop path to each host
--reason: Display the reason a port is in a particular state
PORT SPECIFICATION AND SCAN ORDER:
-p <port ranges>: Only scan specified ports
Ex: -p22; -p1-65535; -p U:53,111,137,T:21-25,80,139,8080
-F: Fast mode - Scan fewer ports than the default scan
-r: Scan ports consecutively - don't randomize
--top-ports <number>: Scan <number> most common ports
--port-ratio <ratio>: Scan ports more common than <ratio>
SERVICE/VERSION DETECTION:
-sV: Probe open ports to determine service/version info
--version-intensity <level>: Set from 0 (light) to 9 (try all probes)
--version-light: Limit to most likely probes (intensity 2)
--version-all: Try every single probe (intensity 9)
--version-trace: Show detailed version scan activity (for debugging)
SCRIPT SCAN:
-sC: equivalent to --script=default
--script=<Lua scripts>: <Lua scripts> is a comma separated list of
directories, script-files or script-categories
--script-args=<n1=v1,[n2=v2,...]>: provide arguments to scripts
--script-trace: Show all data sent and received
--script-updatedb: Update the script database.
OS DETECTION:
-O: Enable OS detection
--osscan-limit: Limit OS detection to promising targets
--osscan-guess: Guess OS more aggressively
TIMING AND PERFORMANCE:
Options which take <time> are in milliseconds, unless you append 's'
(seconds), 'm' (minutes), or 'h' (hours) to the value (e.g. 30m).
-T[0-5]: Set timing template (higher is faster)
--min-hostgroup/max-hostgroup <size>: Parallel host scan group sizes
--min-parallelism/max-parallelism <time>: Probe parallelization
--min-rtt-timeout/max-rtt-timeout/initial-rtt-timeout <time>: Specifies
probe round trip time.
--max-retries <tries>: Caps number of port scan probe retransmissions.
--host-timeout <time>: Give up on target after this long
--scan-delay/--max-scan-delay <time>: Adjust delay between probes
--min-rate <number>: Send packets no slower than <number> per second
--max-rate <number>: Send packets no faster than <number> per second
FIREWALL/IDS EVASION AND SPOOFING:
-f; --mtu <val>: fragment packets (optionally w/given MTU)
-D <decoy1,decoy2[,ME],...>: Cloak a scan with decoys
-S <IP_Address>: Spoof source address
-e <iface>: Use specified interface
-g/--source-port <portnum>: Use given port number
--data-length <num>: Append random data to sent packets
--ip-options <options>: Send packets with specified ip options
--ttl <val>: Set IP time-to-live field
--spoof-mac <mac address/prefix/vendor name>: Spoof your MAC address
--badsum: Send packets with a bogus TCP/UDP checksum
OUTPUT:
-oN/-oX/-oS/-oG <file>: Output scan in normal, XML, s|<rIpt kIddi3,
and Grepable format, respectively, to the given filename.
-oA <basename>: Output in the three major formats at once
-v: Increase verbosity level (use twice or more for greater effect)
-d[level]: Set or increase debugging level (Up to 9 is meaningful)
--open: Only show open (or possibly open) ports
--packet-trace: Show all packets sent and received
--iflist: Print host interfaces and routes (for debugging)
--log-errors: Log errors/warnings to the normal-format output file
--append-output: Append to rather than clobber specified output files
--resume <filename>: Resume an aborted scan
--stylesheet <path/URL>: XSL stylesheet to transform XML output to HTML
--webxml: Reference stylesheet from Nmap.Org for more portable XML
--no-stylesheet: Prevent associating of XSL stylesheet w/XML output
MISC:
-6: Enable IPv6 scanning
-A: Enables OS detection and Version detection, Script scanning and Traceroute
--datadir <dirname>: Specify custom Nmap data file location
--send-eth/--send-ip: Send using raw ethernet frames or IP packets
--privileged: Assume that the user is fully privileged
--unprivileged: Assume the user lacks raw socket privileges
-V: Print version number
-h: Print this help summary page.
EXAMPLES:
nmap -v -A scanme.nmap.org
nmap -v -sP 192.168.0.0/16 10.0.0.0/8
nmap -v -iR 10000 -PN -p 80
SEE THE MAN PAGE FOR MANY MORE OPTIONS, DESCRIPTIONS, AND EXAMPLES

以下引用来自:http://blog.chinaunix.net/u/19330/showart_368554.html

nmap - 网络勘察工具和安全扫描器

nmap被开发用于允许系统管理员察看一个大的网络系统有哪些主机以及其上运行何种服务。它支持多种协
议的扫描如UDP,TCP connect(),TCP SYN (half open), ftp proxy (bounce attack),Reverse-ident,
ICMP (ping sweep), FIN, ACK sweep,Xmas Tree, SYN sweep, 和Null扫描。你可以从SCAN TYPES一节中
察看相关细节。nmap还提供一些实用功能如通过tcp/ip来甄别操作系统类型、秘密扫描、动态延迟和重发
、平行扫描、通过并行的PING侦测下属的主机、欺骗扫描、端口过滤探测、直接的RPC扫描、分布扫描、灵
活的目标选择以及端口的描述。

对非ROOT的用户来说,nmap的正式版可以做很多重要的东西了。不幸的是部份关键的核心功能(比如raw
sockets)需要root权限。所以尽量以root的身份运行nmap。

运行nmap后通常会得到一个关于你扫描的机器的一个实用的端口列表。nmap总是显示该服务的服务名称,端
口号,状态以及协议。状态有'open','filtered'和'unfiltered'三种。'open'指的是目标机器将会在该端
口接受你的连接请求。'filtered'指的是有防火墙、过滤装置或者其它的网络障碍物在这个端口阻挡了
nmap 进一步查明端口是否开放的动作。至于'unfiltered'则只有在大多数的扫描端口都处在'filtered'状
态下才会出现的。

根据选项的使用,nmap还可以报告远程主机下面的特性:使用的操作系统、TCP连续性、在各端口上绑定的
应用程序用户的用户名、DNS名、主机是否是个smurf地址以及一些其它功能。

选项:

这些选项通常都是可组合使用的。使用参数可以精确地定义一个扫描模式。nmap将会尽力捕捉并对不规范
的参数组合作出提示。如果你急于开始,你可以跳过本文未尾的示例节----那儿有最基本的使用方法的示范
。你也可以使用nmap -h来打开关于nmap选项参数的简介。


-sT TCP connect()扫描:这是对TCP的最基本形式的侦测。在该操作下,该connect()对目标主机上你感兴
趣的端口进行试探,如果该端口被监听,则连接成功----否则代表这个端口无法到达。这个技术的很大好处
就是你无须任何特殊权限,在大多数的UNIX系统下这个命令可以被任何人自由地使用。
但是这种形式的探测很容易被目标主机察觉并记录下来。因为服务器接受了一个连接但它却马上断开,于
是其记录会显示出一连串的连接及错误信息。

-sS TCP SYN 扫描:这类技术通常涉及一种"半开"式的扫描----因为你不打开完整的TCP连接,你发送一个
SYN信息包就象你要打开一个真正的连接而且你在等待对方的回应。一个SYN|ACK(应答)会表明该端口是开
放监听的。一个RST(空闲?)则代表该端口未被监听。如果SYN|ACK的回应返回,则会马上发送一个RST包
来中断这个连接(事实上是我们的系统核心在干这事)。这种扫描的最大好处是只有极少的站点会对它作
出记录,但是----你需要有root权限来定制这些SYN包。

-sF -sX -sN
Stealth FIN,Xmas Tree 或者Null扫描模式:有时甚至SYN扫描都不够隐蔽----一些防火墙及信息包过滤装置
会在重要端口守护,SYN包在此时会被截获,一些应用软件如Synlogger以及Courtney对侦测这类型的扫描
都是行家。所以呢,在另一方面要有更进一步的扫描能在不遇到麻烦的情况下通过它们......
这个主意是关闭的端口会对你发送的探测信息包返回一个RST,而打开的端口则对其忽略不理(你可以参阅
RFC 973 PP64)。所以FIN扫描使用空的FIN信息包作为探针、Xmas tree使用FIN,URG,PUSH标记、Null扫
描则不用任何标记。但是不幸的是微软以他们一贯的风格不理睬这一标准......所以这一扫描在WINDOWS9X以及
NT下不能工作。
从积极方面来讲,这其实也是一个很好的区分两种平台的办法----如果这次扫描发现了打开的端口,那你就
能明白这台机器不是运行WINDOWS。如果-sF,-sX,-sN的扫描显示所有端口都是关闭的但一个SYN(-sS)扫描
却显示有打开端口,那你就能大致推断它是WINDOWS平台。这只是一个简单应用,因为现在nmap已经有了更
彻底的操作系统判别方法----当然它的原理类似上面所提到的.
这些平台包括Cisco, BSDI, HP/UX, MVS, 和IRIX。

-sP Ping扫描:有时你仅希望了解网络上有哪些主机是开放的,nmap可以通过对你指定的IP地址发送ICMP
的echo request信息包来做到这一点,有回应的主机就是开放的啦。但令人讨厌的是一些站点比如
microsoft.com对echo request包设置了障碍。这样的话nmap还能发送一个TCP ack包到80端口(默认),
如果获得了RST返回,机器是开放的。第三个方法是发送一个SYN信息包并等待RST 或SYN/ACK响应了。作为
非root的用户可以使用的,常用connect()模式。对root来说,默认的nmap同时使用ICMP和ACK的方法扫描
,当然你也可以改变-P选项。注意你最好先ping一下用户,只有有回应的主机才有必要扫描,只有你不想
探测任何的实际端口扫描只想大面积地搜索一下活动的主机,你可以使用此选项。

-sU UDP扫描:这一方法是用来确定哪个UDP(User Datagram Protocol,RFC 768)端口在主机端开放。这一
技术是以发送零字节的UDP信息包到目标机器的各个端口,如果我们收到一个ICMP端口无法到达的回应,那
么该端口是关闭的,否则我们可以认为它是敞开大门的。有些人或许会认为UDP扫描是无意义的,我通常会
以最近的Solaris rcpbind漏洞来提醒他们。Rpcbind会隐藏在一个非正式的UDP端口于32770口以上,因此
对111进行防火墙过滤是无关紧要的.但你是否查找过在30000以上的端口是否处在监听状态中......,用UDP扫
描你就能轻松地做到这一点!或者大家还可以想想cDc出品的Back Orifice木马(BO),它可以在Windows
的机器中配置一个UDP端口,更不用说如此众多可以利用UDP的、易受攻击的服务如snmp,tftp,NFS等了。但
有一点不得不提及的是UDP扫描在目标主机按照RFC 1812(4.3.2.8节)建议的那样限制ICMP错误信息的传
送速率时会令人痛苦的缓慢。举例来说吧,Linux 的核心配置(在net/ipv4/icmp.h)限制了每4秒产生80次
的无法到达信息----每次产生1/4秒的延迟。Solaris有着更严格的限制(大约每秒两次就会延迟),所以这
要耗费相当长的时间。nmap会侦测到这种限制并自动减缓速度----这也胜过用无意义的会被目标主机忽略的
大量信息包来填充这个网络。如以往一样,微软还是不在乎RFC所建议的事而且没有任何限制性措施实行于
WINDOWS或NT上,这样我们可以把多达65K的端口以极高的速度扫描完毕,欢呼吧!

-sR RPC扫描:这一方法是结合nmap多种扫描的一种模式,它取得所有的TCP/UDP开放端口并且用SunRPC程
序NULL命令来试图确定是否是RPC端口并且----如果是的话,其上运行什么程序,何种版本。这样你可以在目
标主机躲在防火墙后或者由TCP wrappers防护着,它都能取得效果近似于'rpcinfo -p'的信息。但Decoys
现在还不能正常工作在RPC扫描下,在以后我会在UDP RPC扫描中加入Decoy支持的。

-b(ftp relay host)
FTP 跳跃攻击:FTP协议的一个有趣的特点是它支持代理FTP连接(RFC 959),用另一句话说,我可以从
evil.com连接到一个FTP服务器target.com并且要求目标主机发送文件到因特网的*任何地方*!在1985年这
一RFC被写下来后这一特性便渐渐施行,但在现在的网络上我们不允许人们能够随意地"抢劫"一个FTP
SERVER并请求数据到任何地方。所以在Hobbit于1995年写下的有关这一协议缺陷时说到"它可以用来从许多
站台上发出事实上难以追查的信件、新闻以及攻击性行为----填充你的硬盘,试图使防火墙失效或者更多是
烦人而无意义的骚扰。我开发出它来是为了通过一个代理FTP服务器察看TCP端口,这样你可以连上一个在
防火墙后的FTP服务器然后扫描它看来仿佛堵塞的端口(139是很好的例子)。如果FTP服务器允许你读甚至
写进某些目录(比如/incoming),你可以发送任意信息到你发现打开了的端口(当然nmap不干这事)。对
于你要通过'b'选项来使主机成为你的代理时,标准的URL格式形式是:username:password@server:port。
要确定一个服务器是否易受这样的攻击,你可以看看我在Phrack 51期上的文章。它的更新版本在
http://www.insecure.org/nmap。

这些选项并非必需的,但有些会非常实用。

-P0 在扫描前不尝试或者PING主机,这是用来扫描那些不允许ICMP echo 请求(或应答)的主机。
microsoft.com就是这其中的一个例子,我们就必须使用-P0或者-PT80来察看microsoft.com的端口。

-PT 用TCP的ping来确定主机是否打开。作为替代发送ICMP echo请求包并等待回应的方式,我们可以大量
发送TCP ACK包往目标网络(或者单机)并一点点地等待它的回应,打开的主机会返回一个RST。这一参数
可以让你在ping信息包阻塞时仍能高效率地扫描一个网络/主机。对非root的用户,我们用connect(),以
如下格式设置目标探针-PT,默认的端口是80,因为这相端口往往未被过滤。

-PS 这一选项是root用户使用的,能用SYN(连接请求)包替代ACK包,打开的主机会有一个RST(或者SYN|ACK--
--但比较少见)应答。

-PI 这一选项是使用一个真正的ping(ICMP echo request)包。它找到开放的主机并且将该子网中的广播地
址全数搜寻----该广播地址是能够到达并能正确解析IP包的。如果其会被大量的DoS(denial of service)攻
击时,我们就能找到它。

-PB 默认的ping形式,它用于ACK(-PT)与ICMP(-PI)并行攻击,以这一形式可以通过防火墙或包过滤。

-O 经由TCP/IP获取'指纹'来判别主机的OS类型,用另一说法,就是用一连串的信息包探测出你所扫描的主
机位于操作系统有关堆栈信息并区分其精细差别,以此判别操作系统。它用搜集到的信息建立一个"指纹"
用来同已知的操作系统的指印相比较(the nmap-os-fingerprints file)
----这样判定操作系统就有了依据。
如果你发现一台机器开了至少一个端口并得到错误的诊断信息,那么你可以写信告诉我相关细节比如操作
系统版本或侦测到的操作系统版本图,如果他有端口开放但nmap返回'不可识别的操作系统',这可能也是
有用的,你可以将它的IP告诉我或者另一个办法是用nmap的-d参数并告诉我它返回的"指印"----操作系统和
版本号,这样做,也算是对nmap在判定操作系统的进一步开发中做了些事情,以便后续版本中它能更精确
地判别系统类型。

-I 这是用ident扫描方式的参数,如Dave Goldsmith于1996年在Bugtraq中所说的,这个ident协议(rfc
1413)允许通过TCP连接得到拥有进程的用户名----即使这个连接不是由该进程发起的。所以呢,举个例吧,
你可以通过ident连接到一个http端口并找出该进程是否由root运行,但这只能在"全开"的对目标端口的
TCP连接中使用(象-sT扫描参数)。当你用-I参数时,远程主机的identd在开放的端口接受连接质询----很
明显的,如果主机不运行identd的话,那它就无法正常工作。

-f 这个参数配置以细小的IP碎片包实现SYN,FIN,XMAS或NULL扫描请求。这个想法是把TCP包头分别放在
几个不同的信息包中,使包过滤器难于运作,而后你就可以闯入系统做你想做的事了。但要注意,部份程
序可能会对这些小信息包处理错误。比方说我最喜欢的sniffer segmentation在接收第一个36字节的信息
碎片时就出现麻烦,之后又来了个24字节的!当包过滤器和能将IP碎片排列的防火墙没有获得此顺序时(
就象linux内核中的CON-FIG_IP_ALWAYS_DEFRAG选项),一些网络系统就不能反映出找到目标,并且放弃。
记住这个参数不一定能很好地工作在任何系统上,它在我的Linux,FreeBSD以及OpenBSD下是正常的,当然也
有一些人说它能在部份不同的*NIX环境下工作。

-v 详细模式。这是被强烈推荐的选项,因为它能带来你想要的更多信息。你可以重复使用它以获得更大效
果。如果你需要大量翻动屏幕请使用 -d 命令两次

-h 这是一个快捷的帮助选项,可以在屏幕上显示nmap的参数使用方法----象你注意到的那样,这个man page
实在不是一个"快速入门参考":)

-o
这是用来指定一个放置扫描结果的文件的参数----这个结果是易于阅读的。

-m
这也是存放扫描结果的参数,但它是存放机器可解析(machine parseable)结果的,你可以用-m 带'-'(
引号不用)将其输出到标准输出里(用shell的管道符......)。在这种形式下,正常的输出被禁止了,你需要
察看一些错误信息来了解情况。

-i
从指定文件而不是从命令行读取数据。该文件可以存放一个主机或网络的列表,中间用空格、TAB键或者换
行来分隔。如果希望从标准输入设备(文件)读取----比如在管道符的末端,你要将连字号(-)用于文件名。
你可以从目标规格里找到更多关于写这一文件的资料。

-p
这一参数可以指定你希望扫描的端口,举例来说吧'-p 23'则只会对主机的23端口进行探测,默认扫描的是
从1到1024端口,或者也可以用nmap里带的services file里的端口列表。

-F 快速扫描模式。指定只希望扫描nmap里提供的services file中列出的端口列表里的端口。这明显会比
扫描所有65535个端口来得快。

-D
这是一种带有诱骗模式的扫描,在远程主机的连接记录里会记下所有你所指定的诱骗性的地址。这样的话
他们的数据存储器会显示有一些端口扫描从某个IP发起,然而他们无法辩别哪个是真正的IP而哪个是用来
作为掩护的,这可以击败一些通过路由进行跟踪的行为,所以它是一项隐藏你的IP的很实用的技术。用逗
号分隔各个欺骗地址,你可以随意地将'me'放进任意一个你希望显示真实IP的地方,如果你将'ME'放在第
六位甚至最后,有些端口扫描记录器(比如Solar Designer's excellent scanlogd)可能根本就不会显示
你的IP,如果你不用'ME'的话,nmap将会将它随机放置。记住你用来诱骗的主机必须是开放的或者你可以
半开扫描一下你的目标。因为要从一堆实际上没有用的IP地址里判别出哪个是真正的入侵者是相当容易的
。你还可能要用IP地址来代替名字,这样诱骗主机的nameserver logs里才不会记录下你来。还要记得有些
(愚蠢的)"端口扫描探测器"会拒绝到达主机的端口扫描尝试。这样你无意中就会导致你扫描的主机与"诱
骗主机"连接的丢失,这样可能会带来一个很大的问题是----如果这个"诱骗主机"是一个网上的网关或者甚至
就是其本地的机子,其连接一样会断开!所以大家最好小心使用这个参数----从道德上的原因----这仅仅是一
个诱骗,不是么?这种诱骗可以用在最初的ping扫描(用ICMP,SYN,ACK或其它)与实际的端口状态扫描中
,它还可以用于远程OS的判别(-O)。当然如果你写入太多的诱骗地址也是没什么用处的,那只能减缓扫描
速度以及降低一些精确度。而且一些指令处理系统还可能会过滤掉你的欺骗包,虽然多数(几乎是全部了
)不会对欺骗包作出任何限制。

-S
在某些环境下nmap可能无法确定你的源地址----这种情况下nmap会有提示,这时你就要用-S带IP地址来标注
。另一种使用的可能性是用来欺骗目标使它认为某人在扫描它。设想一下,某个公司发现被竞争者持续不
断的扫描:),这是一个不被支持的用法,或者说,不是主要目的。我只是用它来提醒人们在发现一个端口扫
描者时别光顾责难,可能他是无辜的呢。-e能够说明这个参数的一般用法。

-e
告诉nmap哪个界面要发送或接收。nmap能够自动探测它,如果无法做到,亦会有提示信息。

-g
在扫描中设定源端口号。许多"天真"的防火墙或包过滤器除了它们建立的允许DNS(53)或FTP-DATA(20)的包
进来建立连接之外,其余一概过滤,显然这是很轻率的做法,因为入侵者能够轻易地编辑一个来自FTP或
DNS的源端口。比如说,你如果无法从一个主机的host:port通过TCP ISN取得信息,那么通过用-g 命令,
nmap会改变源端口再次尝试。需要了解的是,使用这个选项可能会有小小的延迟,因为我有时需要在源端
口号中存储有用信息.


-M
设定用来并行进行TCP connect()扫描的最大的sockets数目(默认)。这对将扫描适度减缓是相当有效的
,它可以避免把远程主机crashing。另一个途径是用-sS。

虽然nmap在一般情况下都能够很好地在运行时间里尽可能迅速地完成扫描任务,但偶尔还是会有一些主机/
端口无法侦测,这可能是nmap默认的时间策略和你的目标不太一致(相当于timeout的设定),下面就是一
些选项能对扫描的时间进行控制:

-T
这是一个可以用来便利地表达nmap时间策略优先权的参数设置。Paranoid模式用极慢的速度来扫描以避免
被数字记录系统记录。它使扫描连续而不是并发而且通常等待至少五分钟才发送一个信息包。Sneaky也是
类似的,只是它是每15秒发送一个信息包。Polite模式是用来减轻网络负载以减少当机的可能性,它是连
续发送探针并在两个包的间隙等待0.4秒。Normal是nmap的常规用法,是尽其所能地快速扫描----除非主机或
端口连接丢失。Aggressive模式是对每台主机设定了五分钟的timeout,并且等待每个探针应答不超过1.25
秒。Insane模式是适应非常快的网络或者你不在乎丢失一些信息----因为太快!它的timeout设定于75秒并且
只等待回应0.3秒,它允许对一个很快的网络系统进行"扫荡":),你也可以用数字(0-5)来代表参数,比如'
-t 0'表示Paranoid而'-t 5'代表Insane模式。注意,这些时间设定无法在底层的控制中联合使用。(NOT
be used in combination with the lower level controls given below.)

--host_timeout
具体指定nmap对某个IP的扫描时间总量,超过则作不通处理,默认是不做设定。

--max_rtt_timeout
指定nmap对一个探针从远程端返回回应的最大时间,默认是9000。

--initial_rtt_timeout
指定最初探针的timeout时间,这通常在用-P0扫描有防火墙保护的主机时很有效,nmap会通过ping得到一
个好的RTT评估以及最初少数的探针。默认值为6000。

--max_parallelism
指定nmap允许的最大并行扫描数目,设定为1表明nmap每次只扫描个端口,它同样会对其它扫描如ping
sweep, RPC scan等产生影响。

--scan_delay
指定nmap必须等待的两个探针间的最小的时间。这是减少网络负载及使扫描在综合数据存储的记录下不那
么显眼的办法。

目标说明
--------*

所有不带参数的选项都会被视为是nmap的目标主机描述。最简单的实例是仅仅在命令行列出单一的主机名
或IP地址。如果你希望扫描一个IP地址的子网,你可以在主机名和IP地址中加入'/mask'。mask必需是在0
(扫描整个网络)和32(特定的单一主机)。用/24则表明扫找一个C类地址,而/16则是扫描B类
......

nmap还有一些更有用的符号说明方式可以让你用list/ranges来为每个元素指定IP地址。比如你要扫描B类
网址128.210.*.*,则可以用'128.210.*.*'或'128.210.0-255.0-255'或者甚至是'128.210.1-50,51-
255.1,2,3,4,5-255'来表示。当然你也可以用上面提过的mask来表示:'128.210.0.0/16'。所有这些都是等
价的,当你用'*'的时候记住多数的shell都要求用定界符比如引号将其标注。

另一个有趣的是你可以用其它方法将整个网络"分割",比如你可以用'*.*.5.6-7'来扫描所有以.5.6或
.5.7结束的IP地址。要得到更多信息,你可以看看示例节。

这里是一些运用nmap的扫描范例,从最简单普通的到有一些复杂的例子都有。注意这里有真实的数字以及
一些真实的域名----这样可以让扫描行为看起来更具体。在这里你可以用自己的网络里的名称代替其中的
addresses/names。虽然端口扫描的结果分析可能会使某些人容易攻击,但我不认为它是不合法的,我曾经
扫描过成百上千的机器但只收到一次抱怨。但我不是律师而一些(anal)人们对nmap探测觉得烦恼,所以最
好在取得允许后扫描或者----冒险,后果由你自己承担。

nmap -v target.example.com

这样对target.example.com上所有的保留TCP端口做了一次扫描,-v表示用详细模式。

nmap -sS -O target.example.com/24

这将开始一次SYN的半开扫描,针对的目标是target.example.com所在的C类子网,它还试图确定在其上运
行的是什么系统。这需要root权限,因为用到了半开扫描以及系统侦测。

nmap -sX -p 22,53,110,143,4564 128.210.*.1-127

发送一个Xmas tree扫描到B类128.210所在子网的一半范围内,我们将检测系统是否运行sshd, DNS,
pop3d, imapd, 或者端口4564。要注意由于微软TCP堆栈的不完善,Xmas扫描将不能在其平台上运行成功,
同样的问题可能存在于CISCO, IRIX, HP/UX, 和BSDI。

nmap -v -p 80 '*.*.2.3-5'

这是定位一个网域(将整个网络分隔成许多小部份)再进行扫描的方式,这里扫描的是所有以.2.3,.2.4,
或.2.5结束的IP地址。如果你是ROOT的话也可以用-sS。同样的你可以从127开始搜寻更多有趣的机器,你
可以用'127-222'替代前面的星号----恕我直言,那个区域有着大量有趣的机器。

host -l company.com | cut '-d ' -f 4 | ./nmap -v -i -

做一个DNS zone transfer来寻找在company.com进而的主机并且将IP地址送至nmap(feed the IP
addresses to nmap)。这个命令是在我的GNU/Linux平台下运行的,你可能需要用不同的选项参数或者不同
的操作系统。
Mr Wang

王炜,现在福建泉州从事 B2C 电子商务。爱好编程,业余时间在 FreeBSD / Apache / PHP / PostgerSQL 平台开发 B/S 架构的免费软件。

Follow Google Buzz Twitter Facebook Sina

收藏王炜's Blog

Bookmark and Share

关于此归档

这里是分类Servers中的最新日记。

上一个分类Our KeepAccounts

下一个分类Web

首页归档页可以看到最新的日记和所有日记。