fsockopen真好用,PHP的高级别网络函数!

今天用Burp工具分析了一个网站的大致功能后打算写程序把该网站我感兴趣的内容全抓下来。
一开始用java写了一小段,但哥对Java不熟悉哇,而且哥觉得Java的那么多流的类,如果仅仅操作文本文件,就显得封装的太厚了。又想,用C/C++写。虽然用C/C++写的最多代码,但事实上C/C++的字符串操作一想起来就嫌烦,而且正则式也烂得可以,数组不支持用字符串索引也真够麻烦,虽然可用C++的std::map容器。最后决定用PHP写…PHP真是太好用了~~~犹赞超强大的正则式,同perl的正则式有得一拼啊。如果换用标准C字符串函数和GNU的一个超难用的C正则式库,那要写死人啊~~~

最开始的思维定势就是要先开一个socket(N多参数要填入), 省略bind(操作系统自已选一个本地端口绑定),第二步 connect 到主机,第三步往 socket 里写东西… 虽然只几个简单函数,但要填的几个参数也真够难记的。嘿,偶像发现事实上PHP提供了high-level的socket函数 fsockopen()。哇,太方便了。

fsockopen()
returns a file pointer which may be used together with the other file functions (such as fgets(), fgetss(), fwrite(), fclose(), and feof())
fsocketopen返回一个文件指针,然后就可以用常用的文件函数操作它啦!!!和操作文本一件一样~~~ 比 Java 的 java.io.socket 类还要方便~~虽然java也抽象的不错,但我就是嫌流对象封装太厚了。人生苦短,何必自找麻烦呢。
用完以后用 fclose 把它fsockopen返回的文件指针关掉!

看个例程:
fp = fsockopen(“udp://127.0.0.1”, 13,errno, $errstr);
if (!$fp) {
echo “ERROR: errno –errstr
\n”;
} else {
fwrite($fp, “\n”);
echo fread($fp, 26);
fclose($fp);
}
?>
上面的例程从本机的UDP时间服务器里读取当时的时间和日期。如果你本机开了标准的时间服务的话~~~

copyright ykyi.net

阿崩吹箫,嘥声坏气

#歇后语。
http://ykyi.net 广州话俗语
阿崩吹箫,嘥声坏气
阿崩:豁嘴或缺门牙的人。
嘥:浪费。
缺门牙的人吹箫,又费气力又吹不好。形容说话没有结果,白费唇舌。
%例句: 讲咁多佢一句都听唔入,真系阿崩吹箫,嘥声坏气咯。(说了那么多,他一句也没听进去,真是白说了。)

tcpdump基础教程

英文原文出自: A tcpdump Tutorial and Primer
翻译: ykyi.net

Tcpdump是信息安全专业人士最重要的一个网络分析工具。对这个工具有一个深入的理解对于每一个喜欢透彻理解tcp/ip协议栈的人来话都是必须的。但很多人选择一个更高级别的工级,比如Ethereal Wireshark,但是我认为这是一个错误!

不应该机械的反复记忆概念而应该做到真正的理解,因为对tcp/ip协议簇保持清醒的认知非常的重要。如果对该协议簇能够完全精通,那你调试网络的能力则能比同行们高出几个档次。但是,要学精神tcp/ip协议簇,只有不够的实践剖析它们才能做到。

当你使用某种工具来显示网络中的原始流量信息时,人类,而不是机器,就要承担起分析这些流量的重任了。用这种方法就可以不断地加深对tcp/ip的理解。并且,用这种学习方法的时候,我在任何可能的情况下都强烈主张使用tcpdump而不是其它工具。

选项
下面将列出一些用例子的选项,这样可以在你使用这个工具时对你有很大的帮助。这些选项很容易淡忘或与其它类型的滤镜(Filter,笔者认为这里的滤镜实际上指的是其它网络工具)混淆。比如, ethereal。所以,希望这篇文章可以作为一个参考文档,我就是这样使用它的。

首先,我要先介绍几个我认为很方便的tcpdump的选项。第一个是 -n, 这样的话域名就不会被解析了,而是用数字IP的形式显示地址(译者注: 同netstat的-n是一样的喔)。第二个是 -X, 这样就会同时把包的内容以ASCII码和十六制的形式显示。最后一个是 -S, 它个选项会显示绝对序号而不是相对序号。因为当包被隐藏起来的话,你也不会看到奇怪的序号。请谨记,tcpdump较之其它工具的优势之一就是可以与包(packets)手工交互。

值得注意的是,tcpdump默认只会从packet中取出前96个字节。如果你想要多一些的话,那就需要需要把 -s xxxx 加上。这里的xxxx是你确切想要抓取的总字节数。如果我使用这个选项的话,我通常会把这个数字设定为1514而得到所有的数据。下面是一个简短的列表列出我经常使用的选项。

-i any: 监听所有的介面。这样你就知道是不是有流量产生。
-n: 不要解决主机名,以IP数字形式显示主机。
-nn: 不要解析主机名或端口名字。

-A: 以ASCII字符显示包的数据。
-X: 同时以十六进制和ASCII字符显示包的数据。
-XX: 同-X,但也会显示 Ethernet头部。
-v, -vv, -vvv: 详细,更详细,再详细些! 冗余输出得到的包信息。
-c: 抓取 x 个包后就停下。
-S: 打印绝对序号。
-e: 同时得到Ethernet头部。
-q: 显示少一点协议信息。
-E: 用提供的密钥解密 IPSEC 流量。
-s: 设置显示前多少个字节的包内容(snaplength)。

tcpdump 4.0的snaplength的长度从68字节改成了96字节,这样你就可以看到多些内容了。但仍然看不到所有的内容,指定 -s 1514 得到包的所有内容。

http://ykyi.net
一些基本的应用
根据我要查看的不同流量,我使用不同的选项组合,如下:

1.Basic communication // see the basics without many options
tcpdump -nS

1.基本通讯,不用太多选项睇睇基本的
tcpdump -nS

2.基本通迅,冗余输出。可以看到好多流量,
tcpdump -nnvvS

3. 深入一点查看流量。
tcpdump -nnvvXS // -X 选项必不会使tcpdump输出更多.

4. 看size大一点的包.
tcpdump -nnvvXSs 1514 // -s 1514 选项设定显示所有包内容。

下面的例子使用我们上文提到的选项抓取两个( -c2 )ICMP包(一个ping和一个pong)。请注意每个包我们都能看到些什么。

ykyi.net# tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 1514 bytes
00:20:39.722393 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto ICMP (1), length 84) 192.168.111.128 > 173.83.123.7: ICMP echo request, id 10621, seq 1, length 64
0x0000: 4500 0054 0000 4000 4001 e225 c0a8 6f80 E..T..@.@..%..o.
0x0010: ad53 7b07 0800 64e6 297d 0001 d745 cc4c .S{…d.)}…E.L
0x0020: d005 0b00 0809 0a0b 0c0d 0e0f 1011 1213 …………….
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 ………….!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
00:20:40.064096 IP (tos 0x0, ttl 128, id 25296, offset 0, flags [none], proto ICMP (1), length 84) 173.83.123.7 > 192.168.111.128: ICMP echo reply, id 10621, seq 1, length 64
0x0000: 4500 0054 62d0 0000 8001 7f55 ad53 7b07 E..Tb……U.S{.
0x0010: c0a8 6f80 0000 6ce6 297d 0001 d745 cc4c ..o…l.)}…E.L
0x0020: d005 0b00 0809 0a0b 0c0d 0e0f 1011 1213 …………….
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223 ………….!"#
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233 $%&'()*+,-./0123
0x0050: 3435 3637 4567
2 packets captured
2 packets received by filter
0 packets dropped by kernel
ykyi.net#

表达式(Expressions)
使用表达式可以让你略去各种各样的流量而只得到你真正关注的。掌握表达式并且会创造性地使用组合技巧才使你真正发挥tcpdump的力量。有三种主要的表达式: type, dir 和 proto.

Type选项是host, net, 和 port. 方向用 dir 指示。可以这样 src, dst; src 或者 dst; 而且 src 和 dst。下面是一些你应该熟练掌握的例子。

host: 只查看指定IP或者指定主机的流量(当你使用 -n 选项时不可以指定主机名)
ykyi.net# tcpdump host 1.2.3.4

src, dst: 查看从 src 发出的,或者目的地是 dst 的流量(忽略会话的另一端)
•src, dst // find traffic from only a source or destination (eliminates one side of a host conversation)
ykyi.net# tcpdump src 2.3.4.5
ykyi.net# tcpdump dst 3.4.5.6

net: 使用无类别域间路由(CIDR,Classless Inter-Domain Routing)指定要抓包的网络。
# tcpdump net 1.2.3.0/24

proto: 指定要抓取的包的协议类型,可以指定tcp,udp,或icmp。可以不用敲入proto
# tcpdump icmp

port: 只查看从指定端口进出的流量
# tcpdump port 3389

src, dst port: 指定的源地址和端口号,或者目的地址和端口号。只抓取匹配指定地址端口的流量。
# tcpdump src port 1025
# tcpdump dst port 389

src,dst port, protocal : 组合三种指定条件.
# tcpdump src port 1025 and tcp
# tcpdump udp and src port 53

还有一个选项可以让你指定一个端口地址的范围
•Port Ranges
tcpdump portrange 21-23

指定包的大小
•Packet Size Filter // only see packets below or above a certain size (in bytes)
tcpdump less 32
tcpdump greater 128
tcpdump equal 64

tcpdump > 32 // 也可以使用数学符号
tcpdump

写入文件
用 -w 选项可以指定一个文件,把抓取到的内容存入该文件内。以后还可以用 -r 指定文件,把以前存入的内容再读回来。这是一个相当不错的方法,可以先抓取包,以后再用各种工具分析。

以这种形式抓到的流量是以tcpdump的格式储存的。这种格式在网络分析的工具之间非常通用。这意味着,像 Wireshark, Snort, 等工具也可以读取它。

把出入80端口的所有流量记录到文件中
# tcpdump -s 1514 port 80 -w capture_file

然后,在将来某个时候,你就能够把存在文件中的流量读回,比如:
# tcpdump -r capture_file

创造性的使用tcpdump
表达式确实不错,但是要真正发挥tcpdump的威力来自于创造性地组合使用各种表达式。这样就可以把你想要关注的信息单独抽出来。tcpdump有三种组合方式,如果你稍微懂点计算机,这简直太容易理解了。
1.与操作
and 或者 &&
2.或操作
or 或者 ||
3.非操作
not 或者 !

比如检测来自10.5.2.3去到端口3389的流量
# tcpdump -nnvvS tcp and src 10.5.2.3 and dst port 3389

检测来自网络 192.168.0.0/16 去到网络 10.0.0.0/8 或者网络 172.16.0.0/16 的流量
# tcpdump -nvX src net 192.168.0.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

来自网络 172.16.16.0.0/16 去到主机 1292.168.0.2的 ICMP 流量.
# tcpdump -nvvXSs 1514 dst 192.168.0.2 and src net 172.16.0.0/16 and not icmp

从主机名为 Mars(火星) 或者 Pluto(冥王星) 发出的,目的地不是SSH端口的流量
# tcpdump -vv src mars or pluto and not dst port 22

你已经看到了,你可以创建不同的组合来完成不同的需要。关键在于你知道自己需要怎样的数据,然后就可以使用恰当的语法把它们提炼出来。

同时需要牢记在心的是,当你创建复杂的组合时,你可能会需要用单引号把几个选项括起来。使用单引号是为了告诉 tcpdump 忽略特殊字符(译者注: 同BASH一样)。比如这种情况, 一对小括号"()"。同样的技术可以用来把几个表达式括起来,比如 host, port, net 等。看看下面的例子:

要抓取从10.0.2.4出发去到端口3389或端口22的流量。
# tcpdump src 10.0.2.4 and (dst port 3389 or 22) // 错误的写法!

本应该是一个很有用的组合,但是你运行它,你却得到一个错误,因为小括号!你可以用两种方式纠正这个错误。要么在小括号前加上转义字符 \ 或者把整个组合命令用单引号括起来。

# tcpdump 'src 10.0.2.4 and (dst port 3389 or 22)' // 现在就对了!

进阶部分
你还可以根据包里面的某些字段来组合各种条件指定你要关注的包。这个功能在你想要查看SYNs和RSTs非常有用。

Show me all URG packets:
查看所有的紧急包(URG包)
# tcpdump 'tcp[13] & 32 != 0'

查看所有的确认包(ACK包)
# tcpdump 'tcp[13] & 16 != 0'

查看所有的PSH包
# tcpdump 'tcp[13] & 8 != 0'

查看所有的RST包
# tcpdump 'tcp[13] & 4 != 0'

查看所有的SYN包
# tcpdump 'tcp[13] & 2 != 0'

查看所有的FIN包
# tcpdump 'tcp[13] & 1 != 0'

查看所有的SYN-ACK包
# tcpdump 'tcp[13] = 18'

注意:只有PSH, RST, SYN 和 FIN 标志显示在tcpdump的标志域输出中。URG和ACK也会被显示,但显示在其它的地方而不是在标志位中(Flags Field).

你应该明白为什么以上的命令的写法。tcp[13]表示在tcp头的偏移量13字节的位置,然后作了一个布尔判断。

在神奇的Unix世界,一件事通常可以用好几种方式做到。tcpdump也不例外。下面的例子是另一个通过指定tcp包的标志位来查看包的命令。

Capturing TCP Flags Using the tcpflags Option
用 tcpflags 选项来指定 tcp 标志位。

查看SYN包.
# tcpdump 'tcp[tcpflags] & tcp-syn != 0

特殊流量
查看所有IPv6的流量
# tcpdump ip6

查看所有同时设置了SYN和RST位的流量(仅仅举例,实际上并不可能发生):
# tcpdump 'tcp[13] = 6'

查看所有的 evil 位被设置的流量
# tcpdump 'ip[6] & 128 != 0'

总结:
嗯,这篇文章应该能让你的技术变得更好,当然man手册永远是高手们的必备物品。我真诚希望这篇文章能够帮到你。如果有什么问题,不要犹豫,可以联系我。

copyright ykyi.net

Burp套件教程(Burp Suite)

原文来自http://portswigger.net/burp/
ykyi.net 翻译

使用Burp套件(Burp Suite)
当启动Burp Suite以后,Burp的代理服务器就在本地的loopback介面上的8080端口上开始运行啦!通过设定浏览器使用这个Burp代理服务器,所有的WEB流量就可以被截获,窥视,修改。默认设置下,对非媒体资源(non-media)的请求将被截获而且显示出来(默认的设置可以在Burp Proxy的OPTION选项里修改)。所有的穿过Burp代理服务器的WEB流量将被自动分析并添加到站点地图里,这样就可以知道访问过的网站的内容和功能了。对于Burp的收费Professional版,默认情况下,所有的请求还会自动被Burp Scanner分析从而确定易受攻击的部分。

在你就要刻苦大干一场之前,你需要完美地定义出你的工作的Target Scope(Burp的术语名词,不译出)。最简单的办法就是先浏览目标网站,然后定位相关主机和目录,再使用context菜单项把URL们添加到Target Scope里。中央范围配置(Central Scope Configuration)可以用来配置各个Burp工具。

当你浏览目录WEB网站或程序的时候,你就能对截获的请求和响应进行手工编辑,或者你也可以完全关闭拦截功能。在拦截功能被关闭的情况下,每一条请求和响应仍然被记在历史记录里,所有的WEB内容也会被添加到站点地图里。

除了可以用代理修改拦截下面的讯息,你也可以把迅息发送到其它Burp工具。这样就可以完成各种各样的不同的功能,比如:

》你可以通过把请求发给Repeater来手动调节对WEB程序的测试,也可以不断地重发每个请求。
》对于Professional版,可以把请求发给Scanner,就可以完成主动和被动漏洞扫描。
》你可以把请求发给Intruder,就可以发起一个用户自定义的自动测试来确定一些常见的漏洞。
》如果你发现响应中有会话令牌或者其它本应该是不可预测的ID号,你就可以把这个响应发给Sequencer来测试这个令牌的随机性。
》可以把请求或响应中被模糊化处理的数据发给Decoder来尝试自动解析出明文。
》对于Professional版,你可以使用各种Engagement工具来提高你的工作效率。
对于代理的历史记录,站点地图中的主机·目录·文件 以及Burp工具的任何显示请求和响应的地方 你都可以执行以上任何操作。

中央日志功能(central logging function)记录下来每个Burp工具的所有的响应和请求。每个Burp工具都可以在单独的窗口中运行也可以在TAB WINDOW下运行。每个工具和整个套件的配置可以被保存下来重复使用。对于Professional版,你还可以保存每个工具的状态,这样你就可以随心所欲的重新载入之前保存的状态。

copyright ykyi.net

怎么学粤语

经常有人问怎么才能学好粤语,也经常听到很多人说:听多D讲多D就识啦~ 其实不是这样的,最多只能说部分正确。下面以我的经验告诉你怎么学好粤语。

我来广东之前也不会讲广东话,更要命的我还以为自己唱的几首粤语歌很准,现在回想真是太可怕了。07年到广州没有正式学,一年下来还是什么都不会,大部分听不懂。后来我去了珠海。因为有一次同几个Friend吃饭,其它人都讲白话(白话在广东省指粤语),我不懂啊,觉得不好意思大家迁就我改讲普通话。于是我那次以后开始正式决心学粤语啦!!!事实上用了三个月就基本上能够沟通了,就有人第一次赞我'讲得唔错'啦。

错误的学习方法:
对于大多数人,特别是母语不是客家话,潮汕话,闽南话的年龄在十岁以上的朋友要想仅仅靠“听多点就自然会”几乎是不可能的!只有小孩子有只靠听就能学会语言的‘人类的特有能力’。遗憾的是你不是小孩子了,你的大脑收到声音讯号就在你已经会的语言里找发音相同或相近的,但普通话同粤语的发音相差太大了,粤语还有N多自已独有的词汇。有些词或句子,如果没有人指导你,你就是听一万遍,听十万遍,你也听不懂。到了广州生活工作了十年以上还只能听懂简单粤语的人大把大把就是这个原因。还有些人说找个人教教你就会了。很难!首先找个愿意花大把时间教你的人不容易,更致命的是他们不会教。他们只会不断的告诉你,错了,不对,唔正,点解你发音好怪!但他们不知道怎样才能教会你发正确读音。几个回合下来,你和你的老师全部都精神崩溃了。老师报怨教你不会,你报怨粤语太难。你的老师于是就安慰你了:听多D讲多D就识啦!于是你再过一个星期放弃了。即使是会客家话,潮汕话,闽南话的,这几种方言的发音系统同粤语很接近,也仅仅让你容易学习很多,但这部分人中很多发音也很不正,大把人不分前后鼻音, l 和 n。

实践检验正确的学习方法:
自我经验证明行之有效的学习方法包括四个方面: 1.熟悉粤语拼音. 2.熟悉粤语基本词汇. 3.粤语歌影视做为补充. 4.有一位会纯正粤语的朋友鉴定你的发音。

1. 粤语拼音方案: http://ykyi.net/school/jyutping_crashcourse.php
首先你必须理解普通话拼音,毕竟都是汉语语系,普通话和广东话大部分声母和一半韵母是相同的。另外会英文国际音标是极好的补充!粤语里有两个英文里常用的元音,分别是æ(apple中a的发音)和 ʌ (cup中u的发音),但普通话里没有这两个元音,有些人听到ʌ这个元音就把它当成普通话拼音里的e,有些人把它当成a。另外粤语里的入声同英文里的短元音有点类似,比如book,shit。只是类似,学到粤语入声时可以参考下。闽南语也完整保留入声系统,会闽南语的可以无视入声.会客家话和潮汕话的也基本上可以无视。还有粤语里的 该 字的发音基本上就是英文单词boy的发音把声母由b改成g。再之,粤语有m,n,ng三种韵尾,普通话里没有m韵尾,所以大部分学习者都把粤语里的心sam1读成身san1。歌手易欣有首粤语歌。易欣就是把‘心’唱成‘身’了。要解决这个方音问题,参考一下英语单词的gun(枪),和gum(口香糖)就豁然开朗啦!你能区分gun和gum吗?

然后你就要开始学粤语拼音啦!很多人觉得拼音很难,想跳过这一步,我还是劝你学点粤拼先,磨刀不误砍柴刀,只学了六七成也能让你学粤语时效率提高数十倍。学粤语拼音是为了学习粤语的发音系统,如果你不熟悉粤语的发声系统,很多字的读音,你就总是用自己母语或者普通话的发音系统去理解,这时候虽然你自己听起来一样,但其实读错了。比如不懂粤拼的学习者,一百个有九十八个以为粤语的‘点dim2’和‘典din2’发音是一样的。还有时还很搞笑。比如:说‘阿伯baak3’可能说成‘阿爸baa1’。言归正传,一开始你只需要了解一些粤语拼音,学会使用这个拼音工具来帮助自己理解发音和纠正发音。

2. 熟悉粤语基本词汇
这个是必须的,但也非常容易。比第一项要求要容易很多,估计只需要花你几个小时的时间。你可以买一两本粤语书教程,一般的教程基本上都讲了粤语用的日常词汇。http://ykyi.net/toubou/promote.php 这里有介绍的书中有几本我用过有些人连粤语的基本词汇都不知道就冲到QQ群里叫人教粤语。拜托,谁有那么多时间啊。点解,点样,唔该,得佐,冇,先,添 这些很日常的词汇看看就会了。语法的话,虽然粤语有句式有小小不同,但基本上和普通话一样,可以无视的。大话西游里的台词"给个理由先"就是广东话的句式。

3. 粤语歌和影视,新闻媒体
听唱粤语歌和看粤语发音的影视可以让你在娱乐中培养你的听觉系统把某些发音同各个汉字建立联系。因为普通话的发音同粤语话相去甚远,你需要听唱N多粤语歌和影视或者新闻来建立这个声音到字的条件反射。在这个过程中,之前你学过的一粤语拼音就要派上用场了。你听到发音的时候去想这个字的粤语拼音,在实践中理解那些你之前不懂的发音,比如 oe 是什么(实际上是国际音标中的æ);p,t,k入声字怎么读,以及粤语的各个不同的声调等等任何你之前不理解的粤语拼音在实践中不断体会。

4. 有一个粤语老师。
这个非常重要,基本上和第一条一样重要。实际上第二,第三条你都可以略去,但第一和第四条太重要了。如果缺了第一条,仅有老师,他极有可能像此文刚开始提到的那样教不会你;如果缺了第四条,你不知道自己的发音有没有发对。比如律师的律字注音为 leot6 , 用国际音标可以注为 læt, 这个字读粤语的第六声。假如这个字你没有把握,你就去问你的老师自己发音有没有读对,然后不断的参照拼音调整自己的口腔的吐气声调,直到你的老师肯定你的发音。如果没有粤拼,你很痛苦的,你的老师也更痛苦,一个不知道哪里读错了,一个不知道怎么才让你读对。比如粤语的六个音调,你就可以选夫(fu1), 苦(fu2), 富(fu3), 扶(fu4), 妇(fu5), 父(fu6) 这六个字在同你老师交流中体会学习。韵母a, aa亦然,粤拼里的a实际上是英语音标中的ʌ,aa才是普拼和音标中的a. 以粤拼为工具在和你的老师交流过程中学习吧!

以上四个条件,互相促进!!!如果你按照这个方法做了。学会用粤语基本沟通是很容易的事情,我就是用这个方法学的,不过用了三个月的时间而已。学会唱粤语歌更加是小菜一碟了!