学习笔记

多想还能有上课记笔记的机会!

关于安装操作系统

近期打算把ubuntu9.04+xp 换成ubuntu 10.04+win7,多年没有光驱,先把硬盘安装的方法搜集下。

另外本来打算4.29下载10.04的,现在看来已经可以下了。

—————————–ubuntu 10.04下载地址————————————————

附ubuntu 10.04下载地址如下,是Daily Build版本的,发布日期是4-26,已经修复那个内存泄露的问题,我认为可以下了,也算是为后面大家分流了。

http://cdimage.ubuntu.com/dvd/current/lucid-dvd-i386.iso    这个是x86的

http://cdimage.ubuntu.com/dvd/current/lucid-dvd-amd64.iso     64位的

习惯先装win,犹豫以前一直习惯的PE系统装win7时不是那么顺利了,但是前人播种后人收,win7的硬盘安装方法不外乎下面几种:

—————————–硬盘安装WIN7————————————————

一、windows 7系统下全新安装高版Windows7:
1、下载windows7 7600 ISO镜像(RC或RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、开机按F8——修复系统——选择最后一项命令修复——在命令框输入“D:\7600\sources\setup.exe“(不带引号)
3、进入安装界面、选择custom安装
4、选择安装语言、格式化C盘
5、OK了,装好后是一个纯系统(非双系统)。

二、如果有vista安装盘的话,方法也很简单:
1、下载windows7 7600 ISO镜像(RC或RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、BIOS中选择光驱启动,进入vista安装界面
3、选择左下角修复计算机(自动搜索系统,提示加载驱动或关闭,选择关闭进入修复选项)
4、选择最后一项命令修复,在命令框输入“D:\7600\sources\setup.exe“(不带引号),开始安装
5、选择安装语言、格式化C盘 (即使C盘原本没有系统此法也可行)

三、XP系统下全新安装windows 7:
1、下载windows 7 7600 ISO镜像(RC或RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、把D:\7600目录下的bootmgr和boot目录(其实只要里面的boot.sdi和bcd文件)拷贝到c盘根目录下,并在C盘根目录下建个sources文件夹。(XP下不需要取得管理员权限)
3、把D:\7600\sources下的boot.win复制到C盘刚建的sources文件夹
4、用管理员身份运行cmd,然后输入c:\boot\bootsect.exe /nt60 c: 提示successful(即成功了!)
5、关闭cmd窗口重启计算机,自动进入安装界面,选择安装语言,同时选择适合自己的时间和货币显示种类及键盘和输入方式
6、出现“开始安装界面”,(要注意了,不点击“现在安装”)点左下角“修复计算机”(repair mycomputer),进入”系统恢复选择”,选择最后一项”命令提示符”(commandprompt),进入DOS窗口
7、输入“D:\7600\sources\setup.exe“(不带引号),开始安装
8、选择安装语言、格式化C盘,就OK了

四、vista系统下全新安装windows7(实践证明XP用此种方法也更加方便):
1、下载windows 7 7600 ISO镜像(RC或RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、复制D:\7600文件夹中的Boot、EFI、sources文件夹和bootmgr至C盘根目录下
3、复制D:\7600\boot下Bootsect.exe至C盘根目录下
第2部需取得管理员权限
4、管理员身份运行cmd,输入c:\bootsect.exe/nt60 c:并回车(最好复制,中间有空格)
5、重启系统自动进入安装界面,点左下角的修复计算机repair my computer)
6、选择最后一项命令提示符,进入DOS窗口,输入D:\7600\sources\setup.exe进入安装界面
7、选择安装语言、格式化C盘,就OK了

五.在PE系统下的安装方法:
1、下载windows 7 7600 ISO镜像(RC或RTM),用虚拟光驱拷贝至非C盘(如D:\7600)
2、格式C盘,ntfs格式。
2、把D:\7600目录下的bootmgr和boot目录(其实只要里面的boot.sdi和bcd文件)拷贝到c盘根目录下,并在C盘根目录下建个sources文件夹。
3、把D:\7600\sources下的boot.win复制到C盘刚建的sources文件夹
4、运行cmd,然后输入c:\boot\bootsect.exe/nt60 c: 提示successful(即成功了!)
5、关闭cmd窗口,重启计算机,自动进入安装界面,选择安装语言,同时选择适合自己的时间和货币显示种类及键盘和输入方式
6、出现“开始安装界面”,(要注意了,不点击“现在安装”)点左下角“修复计算机”(repair mycomputer),进入”系统恢复选择”,选择最后一项”命令提示符”(commandprompt),进入DOS窗口
7、输入“D:\7600\sources\setup.exe“(不带引号),开始安装
8、选择安装语言、格式化C盘,就OK了

六。简单的工具硬盘安装win7的方法:(xp和vista下安装win7均可)推荐使用这种安装方法。

1.将win7的iso文件解压到安装目标盘以外的任何盘符的根目录下,

2.下载工具nt6 hdd installer.exe 直接运行从起后会在启动项里添加Nt6 hdd Installer (如没有加载成功请用管理员身份从新运行安装)

3.从起电脑后 选择进入Nt6 hdd Installer 后等待自动进入win7安装程序(选择安装目标盘.点高级选项可以格式化为ntfs格式)

4.硬盘安装工具下载链接:http://www.vdisk.cn/down/index/3854333A2298/nt6+hdd+installer+v2.8.1.rar.html

—————————–硬盘安装WIN7————————————————

硬盘下安装ubuntu的方法,老办法,看帖子就可以了

http://forum.ubuntu.org.cn/viewtopic.php?f=48&t=196335

另外装完了ubuntu不见了win7引导的,看这个帖子

http://forum.ubuntu.org.cn/viewtopic.php?f=48&t=196335

还有就是win7装的时候可以直接格C盘,不选创建分区,这样就不用弄那个讨厌的隐藏分区了。

Linux配置Bond

转自:

http://www.cnblogs.com/killkill/archive/2009/01/12/1374271.html

我们在这介绍的Linux双网卡绑定实现就是使用两块网卡虚拟成为一块网卡,这个聚合起来的设备看起来是一个单独的以太网接口设备,通俗点讲就是两块网卡具有相同的IP地址而并行链接聚合成一个逻辑链路工作。其实这项技术在Sun和Cisco中早已存在,被称为Trunking和Etherchannel技术,在Linux的2.4.x的内核中也采用这这种技术,被称为bonding。

      bonding技术的最早应用是在集群——beowulf上,为了提高集群节点间的数据传输而设计的。下面我们讨论一下bonding 的原理,什么是bonding需要从网卡的混杂(promisc)模式说起。我们知道,在正常情况下,网卡只接收目的硬件地址(MAC Address)是自身Mac的以太网帧,对于别的数据帧都滤掉,以减轻驱动程序的负担。但是网卡也支持另外一种被称为混杂promisc的模式,可以接收网络上所有的帧,比如说tcpdump,就是运行在这个模式下。bonding也运行在这个模式下,而且修改了驱动程序中的mac地址,将两块网卡的Mac地址改成相同,可以接收特定mac的数据帧。然后把相应的数据帧传送给bond驱动程序处理。

      直接给两块网卡设置同一IP地址是不可能的。Kernels 2.4.12及以后的版本均供bonding模块,以前的版本可以通过patch实现。

一、编辑虚拟网络接口配置文件,指定网卡IP

假设eth0是对外服务的网卡,已经调试好网络;eth1是希望与eth0同时对外提供服务的网卡。

# cd /etc/sysconfig/network-scripts/
# vi ifcfg-bond0 

写入如下信息和原来 ifcfg-eth0 的配置其实差不多。

所以我建议执行如下语句,将ifcfg-eth0复制一份再改。

# cp ifcfg-eth0 ifcfg-bon0

将ifcfg-bon0的信息修改大致如下:

DEVICE=bond0 
BOOTPROTO=static 
IPADDR=[IP] 
NETMASK=[MASK] 
BROADCAST=[BROADCAST] 
GATEWAY=[GATEWAY] 
ONBOOT=yes 
TYPE=Ethernet

二、配置真实网卡

修改ifcfg-eth0如下:

DEVICE=eth0 
BOOTPROTO=none 
ONBOOT=yes 
MASTER=bond0 #如果不写,则必须做第四步 
SLAVE=yes       #如果不写,则必须做第四步 
USERCTL=yes

类似地修ifcfg-eth1如下:

DEVICE=eth1 
BOOTPROTO=none 
ONBOOT=yes 
MASTER=bond0 #如果不写,则必须做第四步 
SLAVE=yes       #如果不写,则必须做第四步 
USERCTL=yes

三、加载模块,让系统支持bonding

默认情况下,内核已支持bonding,只需要简单修改/etc/modprobe.conf 这个配置文档就可以了:添加两行

alias bond0 bonding 
options bond0 miimon=100 mode=1

说明:
      mode指定了bond0的工作模式,常用的是0和1,0表示负载均衡方式,1表示主从方式,可根据需要自行配置。常用的为0,1两种。mode=0表示load balancing (round-robin)为负载均衡方式,两块网卡都工作。mode=1表示fault-tolerance (active-backup)提供冗余功能,工作方式是主备的工作方式,也就是说默认情况下只有一块网卡工作,另一块做备份。bonding只能提供链路监测,即从主机到交换机的链路是否接通。如果只是交换机对外的链路down掉了,而交换机本身并没有故障,那么bonding会认为链路没有问题而继续使用。 miimon是用来进行链路监测的。比如:miimon=100,那么系统每100ms监测一次链路连接状态,如果有一条线路不通就转入另一条线路。

四、增加开机启动脚本

在 /etc/rc.d/rc.local里加上

ifenslave bond0 eth0 eth1

如果eth0和eth1都写了MASTER和SLAVE,则上面的步骤做不做都无所谓。

五、重启

reboot或者service network restart 都可以看到结果。

六、测试

      ping着某个地址,当然是能ping通的地址啦。如果发现网络不通,请检查ifcfg-bond0的网络设置。

然后拔掉一根网线,如果ping没断,证明拔了一根backup的线,不是主线,重新插上等两分钟。

此时拔掉另一根网线,估计现在可以看到ping超时或者卡在那里,稍等10~30秒,ping继续连同。

测试成功。

数字证书基础

数字证书基础

数字证书是一种数字标识,可以说是Internet上的安全护照或身份证明。当人们到其他国家旅行时,用户护照可以证实其身份,并被获准进入这个国家。数字证书提供的是网络上的身份证明。

数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息和公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名。一般情况下证书中还包括密钥的有效时间,发证机关(证书授权中心)的名称,该证书的序列号等信息,证书的格式遵循ITUT X.509国际标准。

3.1.1 证书格式
在Internet网络中,应用程序使用的证书都来自不同的厂商或组织,为了实现可交互性,要求证书能够被不同的系统识别,符合一定的格式,并实现标准化。X.509为证书及其CRL格式提供了一个标准。但X.509本身不是Internet标准,而是国际电联ITU标准,它定义了一个开放的框架,并在一定的范围内可以进行扩展。

为了适应PKI技术的发展,IETF也必须制定在Internet上使用X.509和CRL的标准。PKIX工作组就提供了一个Internet草案”Part I: X.509 Certificate and CRL Profile”(详细内容可见:ftp://ftp.ietf.org/internet-drafts/draft-ietf-pkix-ipki-part1-11.txt),用于定义在Internet PKI中使用X.509和CRL的方法和规范。该草案把X.509作为标准,并对各标准项和扩展做了说明,基本接收了X.509作为Internet中的证书标准,但也定义了被PKI应用的X.509 V3和CRL V2标准格式的设置,这些设置包含了PKIX工作组对X.509所做的一些新的扩展。

X.509目前有三个版本:V1、V2和V3,其中V3是在V2的基础上加上扩展项后的版本,这些扩展包括由ISO文档(X.509-AM)定义的标准扩展,也包括由其他组织或团体定义或注册的扩展项。X.509由ITU-T X.509(前身为CCITT X.509)或ISO/IEC 9594-8定义,最早以X.500目录建议的一部分发表于1988年,并作为V1版本的证书格式。X.500于1993年进行了修改,并在V1基础上增加了两个额外的域,用于支持目录存取控制,从而产生了V2版本。

为了适应新的需求ISO/IEC和ANSI X9发展了X.509 V3版本证书格式,该版本证书通过增加标准扩展项对V1和V2证书进行了扩展。另外,根据实际需要,各个组织或团体也可以增加自己的私有扩展。

X.509 V1和V2证书所包含的主要内容如下:

  • 证书版本号(Version):版本号指明X.509证书的格式版本,现在的值可以为0、1、2,也为将来的版本进行了预定义。
  • 证书序列号(SerialNumber):序列号指定由CA分配给证书的唯一的数字型标识符。当证书被取消时,实际上是将此证书的序列号放入由CA签发的CRL中,这也是序列号唯一的原因。
  • 签名算法标识符(Signature):签名算法标识用来指定由CA签发证书时所使用的签名算法。算法标识符用来指定CA签发证书时所使用的公开密钥算法和hash算法,须向国际知名标准组织(如ISO)注册。
  • 签发机构名(Issuer):此域用来标识签发证书的CA的X.500 DN名字。包括国家、省市、地区、组织机构、单位部门和通用名。
  • 有效期(Validity):指定证书的有效期,包括证书开始生效的日期和时间以及失效的日期和时间。每次使用证书时,需要检查证书是否在有效期内。
  • 证书用户名(Subject):指定证书持有者的X.500唯一名字。包括国家、省市、地区、组织机构、单位部门和通用名,还可包含email地址等个人信息等
  • 证书持有者公开密钥信息(subjectPublicKeyInfo):证书持有者公开密钥信息域包含两个重要信息:证书持有者的公开密钥的值;公开密钥使用的算法标识符。此标识符包含公开密钥算法和hash算法。
  • 签发者唯一标识符(Issuer Unique Identifier):签发者唯一标识符在第2版加入证书定义中。此域用在当同一个X.500名字用于多个认证机构时,用一比特字符串来唯一标识签发者的X.500名字。可选。
  • 证书持有者唯一标识符(Subject Unique Identifier):持有证书者唯一标识符在第2版的标准中加入X.509证书定义。此域用在当同一个X.500名字用于多个证书持有者时,用一比特字符串来唯一标识证书持有者的X.500名字。可选。
  • 签名值(Issuer’s Signature):证书签发机构对证书上述内容的签名值。

X.509 V3证书是在v2的基础上一标准形式或普通形式增加了扩展项,以使证书能够附带额外信息。标准扩展是指由X.509 V3版本定义的对V2版本增加的具有广泛应用前景的扩展项,任何人都可以向一些权威机构,如ISO,来注册一些其他扩展,如果这些扩展项应用广泛,也许以后会成为标准扩展项。

3.1.2 CRL格式
证书废除列表CRL(Certificate revocation lists,又称证书黑名单)为应用程序和其它系统提供了一种检验证书有效性的方式。任何一个证书废除以后,证书机构CA会通过发布CRL的方式来通知各个相关方。目前,同X.509 V3证书对对应的CRL为X.509 v2 CRL,其所包含的内容格式如下:

  • CRL的版本号:0表示X.509 V1 标准;1表示X.509 V2 标准;目前常用的是同X.509 V3证书对应的CRL V2版本。
  • 签名算法:包含算法标识和算法参数,用于指定证书签发机构用来对CRL内容进行签名的算法。
  • 证书签发机构名:签发机构的DN名,由国家、省市、地区、组织机构、单位部门和通用名等组成。
  • 此次签发时间:此次CRL签发时间,遵循ITU-T X.509 V2标准的CA在2049年之前把这个域编码为UTCTime类型,在2050或2050年之后年之前把这个域编码为GeneralizedTime类型。
  • 下次签发时间:下次CRL签发时间,遵循ITU-T X.509 V2标准的CA在2049年之前把这个域编码为UTCTime类型,在2050或2050年之后年之前把这个域编码为GeneralizedTime类型。
  • 用户公钥信息,其中包括废除的证书序列号和证书废除时间。废除的证书序列号是指要废除的由同一个CA签发的证书的一个唯一标识号,同一机构签发的证书不会有相同的序列号。
  • 签名算法:对CRL内容进行签名的签名算法。
  • 签名值:证书签发机构对CRL内容的签名值。

另外,CRL中还包含扩展域和条目扩展域。CRL扩展域用于提供与CRL有关的额外信息部份,允许团体和组织定义私有的CRL扩展域来传送他们独有的信息;CRL条目扩展域则提供与CRL条目有关的额外信息部份,允许团体和组织定义私有的CRL条目扩展域来传送他们独有的信息。

3.1.3 证书的存放
数字证书作为一种电子数据格式,可以直接从网上下载,也可以通过其他方式。

  • 使用IC卡存放用户证书。即把用户的数字证书写到IC卡中,供用户随身携带。这样用户在所有能够读IC卡证书的电子商务终端上都可以享受安全电子商务服务。
  • 用户证书直接存放在磁盘或自己的终端上。户将从CA申请来的证书下载或复制到磁盘或自己的PC机或智能终端上,当用户使用自己的终端享受电子商务服务时,直接从终端读入即可。
  • 另外,CRL一般通过网上下载的方式存储在用户端。

PKI 学习1

公钥技术系统可以使得通信安全的前提是:任何需要使用安全服务的通信都是建立在公钥基础上。
而与公钥成对的私钥只掌握在通信的另一方。这个信任基础是通过公钥证书来实现的。
公钥证书就是一个用户身份与他的公钥的结合,在结合之前由一个可信赖的权威机构CA来证实用户的身份,然后再由CA对用户身份及与对应公钥结合的证书进行数字签名,以证明证书的有效性。

PKI 系统的组成:

1.证书签发管理平台:
CA(签发中心),RA(证书注册中心,用户和CA的接口),KMC(密钥管理中心),OCSP,LDAP(证书状态查询)
2.证书应用支撑
SSL,签名,时间戳,其他安全应用
3.业务支撑(应用)
门户、财务、ERP。。。
PKI的基础技术包括加密、数字签名、数据完整性机制、数字信封、双因子身份认证、双重数字签名等。

加密

通过密码算法对数据做变换,似的只有持有解密密钥的人才能恢复数据内容。主要目的为防止信息非授权泄露。
现在密码学的基本原则是:一切密码寓于密钥之中,即算法公开,密钥保密。
PKI把公钥密码和对阵密码结合起来,在Internet上实现密钥的自动管理,保证网上数据的传输安全。

密码与密钥的区别:

其实 就是不要把密码与密文搞混了就行了
密码算法(algorithm)也叫密码(cipher),是用来加密(encryption)和解密(decryption)的数学函数。
密钥(key)是加密和解密用的参数.用来进行明文(pliaintext)和密文(ciphertext)间的转换。
举个例子,你的密码是123
但是明文发送容易被人盗取
你用某个算法加密,密钥是:53csif253a6jt342fd621
传输的便是加密过的数据,比如:fasetqrlkerqoiruq53qrqewlkjrlfasdfa41
解密也需要密钥
加密密钥和解密密钥可以相同(对称加密算法),也可以不相同(非对称算法)

数字签名

数字签名是指使用密码算法对待发的数据进行加密处理,生成出一段信息,并附在原文上一起发送,类似与现实中的签名,由接收方来判断真伪。
每个人都有一对“钥匙”(数字身份),其中一个只有她/他本人知道(密钥),另一个公开的(公钥)。签名的时候用密钥,
验证签名的时候用公钥。又因为任何人都可以落款申称她/他就是你,因此公钥必须向接受者信任的人(身份认证机构)来注册。
注册后身份认证机构给你发一数字证书。对文件签名后,你把此数字证书连同文件及签名一起发给接受者,
接受者向身份认证机构求证是否真地是用你的密钥签发的文件。
过程:先算出数据hash,然后用私钥对hash值进行加密。并与原文一起发送给接受者,接收者只有用发送者的公钥才能对
其解密,解密出hash值后,与接收者自己对原文进行hash所得结果对比,如果结果相同说明信息是完整的,保证了完整性。
由于接受者使用发送者的公钥解密得到原文,因此实现了不可抵赖性。由于接收方使用发送方的公钥进行解密,只有使用
发送方的密钥加密的信息才能被解密,因此这其中也包含了鉴权的过程。

Scapy学习笔记.0×04–SYN扫描器

Scapy系列学习笔记(未完) 来自 www.d-up.org/man
0×01.初识sacpy:http://d-up.org/man/2010/01/scapy0×01/
0×02.创造数据包:http://d-up.org/man/2010/02/scapy0×02/
0×03.发送数据包:http://d-up.org/man/2010/02/scapy0×03/
0×04.SYN扫描器:http://d-up.org/man/2010/03/scapy0×04/
………………(本人不断更新中,转载请保留此信息)

通过前面的学习,我们已经基本可以使用Scapy来生成一些数据包并发送了。现在来学习一些简单的应用,虽然简单,但是功能还是很强大的。

一个简单的SYN扫描器

TCP SYN扫描是一个半开放扫描形式,它利用了TCP 三次握手中的一个步骤,也就是传送SYN标志这个步骤,其他的后续步骤没有发生,主要利用了初次发送syn时,如果目标端口关闭,则会返回一个RST,否则返回ACK和一个SYN。SYN扫描速度很快也就是因为他连三次握手都没握完。
一个典型的SYN扫描器可以通过下面的命令来完成.


>>> sr1(IP(dst='www.d-up.org')/TCP(dport=80,flags='S'))
Begin emission:
....Finished to send 1 packets.
......*
Received 11 packets, got 1 answers, remaining 0 packets
>>
>>>

可以看到,服务器发送过来了seq,通过glags SA (syn-ack)可以看出握手成功。再来测试一个随机的端口。


>>> sr1(IP(dst='www.d-up.org')/TCP(dport=65531,flags='S'))
Begin emission:
Finished to send 1 packets.
....*
Received 5 packets, got 1 answers, remaining 0 packets
>>
>>>

可以看到seq为0,flags=RA (RST-ACK),链接不成功。

扫描多个端口

结合之前学的几个方法,可以快速扫描多个端口。首先dport为一个数组,里面有要扫描的端口,然后在将结果取出,通过查看flags字段,就可以得到目标端口的
开发情况,RA为RST-ACK ,失败。SA为SYN-ACK,成功。


>>> sr(IP(dst="192.168.1.1")/TCP(sport=RandShort(),dport=[440,441,442,443],flags="S"))
>>> ans,unans = _
>>> ans.summary()
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:440 S ======> IP / TCP 192.168.1.1:440 > 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:441 S ======> IP / TCP 192.168.1.1:441 > 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:442 S ======> IP / TCP 192.168.1.1:442 > 192.168.1.100:ftp-data RA / Padding
IP / TCP 192.168.1.100:ftp-data > 192.168.1.1:https S ======> IP / TCP 192.168.1.1:https > 192.168.1.100:ftp-data SA / Padding

处理扫描结果

上面我们显示了完整的请求和响应。我们可以通过简单的循环只显示我们感兴趣的部分,扫描的端口和结果。


>>> ans.summary( lambda(s,r): r.sprintf("%TCP.sport% \t %TCP.flags%") )
440      RA
441      RA
442      RA
https    SA

lambda 是个很操蛋的函数,需要稍微研究下,就是执行一条语句。
我们还可以通过make_table()函数来制个表。


>>> ans,unans = sr(IP(dst=["192.168.1.1","yahoo.com","slashdot.org"])/TCP(dport=[22,80,443],flags="S"))
Begin emission:
.......*.**.......Finished to send 9 packets.
**.*.*..*..................
Received 362 packets, got 8 answers, remaining 1 packets
>>> ans.make_table(
...    lambda(s,r): (s.dst, s.dport,
...    r.sprintf("{TCP:%TCP.flags%}{ICMP:%IP.src% - %ICMP.type%}")))
    66.35.250.150                192.168.1.1 216.109.112.135
22  66.35.250.150 - dest-unreach RA          -
80  SA                           RA          SA
443 SA                           SA          SA

上面的例子可以打印出 ICMP错误,来取代无法得到的响应。
扫描数量较大的时候我们可以只显示出我们关心的结果,例如开放的端口。


>>> ans.nsummary(lfilter = lambda (s,r): r.sprintf("%TCP.flags%") == "SA")
0003 IP / TCP 192.168.1.100:ftp_data > 192.168.1.1:https S ======> IP / TCP 192.168.1.1:https > 192.168.1.100:ftp_data SA

这次我们想得到一个更友好的显示,通过下面的示例可以更好的显示扫描结果:


>>> ans.summary(lfilter = lambda (s,r): r.sprintf("%TCP.flags%") == "SA",prn=lambda(s,r):r.sprintf("%TCP.sport% is open"))
https is open

当扫描的目标更多时,也许下面的显示方法更加招人喜欢:


>>> ans.filter(lambda (s,r):TCP in r and r[TCP].flags&2).make_table(lambda (s,r):
...             (s.dst, s.dport, "X"))
    66.35.250.150 192.168.1.1 216.109.112.135
80  X             -           X
443 X             X           X

如果上面的输出方法,还不能满足你,那么可以使用report_ports()函数,它不仅包括了自动化的SYN扫描,而且还生成了LaTeX格式的结果。


>>> report_ports("192.168.1.1",(440,443))
Begin emission:
...*.**Finished to send 4 packets.
*
Received 8 packets, got 4 answers, remaining 0 packets
'\\begin{tabular}{|r|l|l|}\n\\hline\nhttps & open & SA \\\\\n\\hline\n440
 & closed & TCP RA \\\\\n441 & closed & TCP RA \\\\\n442 & closed &
TCP RA \\\\\n\\hline\n\\hline\n\\end{tabular}\n'

Scapy学习笔记.0×03-发送数据包

Scapy系列学习笔记(未完) 来自 www.d-up.org/man
0×01.初识sacpy:http://d-up.org/man/2010/01/scapy0×01/
0×02.创造数据包:http://d-up.org/man/2010/02/scapy0×02/
0×03.发送数据包:http://d-up.org/man/2010/02/scapy0×03/
0×04.SYN扫描器:http://d-up.org/man/2010/03/scapy0×04/
………………(本人不断更新中,转载请保留此信息)

发送包

前面学习了构造自己的网络数据包,现在该学会如何将他们发送出去了。

这里先介绍两个函数,第一个send(),这个函数将数据包发送在层3上,第二个sendp(),这个函数工作在层2上。

>>> send(IP(dst="1.2.3.4")/ICMP())
.
Sent 1 packets.
>>> sendp(Ether()/IP(dst="1.2.3.4",ttl=(1,4)), iface="eth1")
....
Sent 4 packets.
>>> sendp("I'm travelling on Ethernet", iface="eth1", loop=1, inter=0.2)
................^C
Sent 16 packets.
>>> sendp(rdpcap("/tmp/pcapfile")) # tcpreplay
...........
Sent 11 packets.

开始使用send()的时候,我们只需要指定IP层,也就是层3的内容即可。而在使用sendp()时,需要带上以太的头,也就是带上一个层2的包头。这样才能正确的完成任务。包发送同样支持pacp文件。由于pacp文件中包含完整的信息,所以可以使用sendp()发送成功。

Fuzzing 模糊测试

scapy可以用于对协议的模糊测试中 >_<

fuzzing()方法用于随意修改字段的值,这些值可以是不正确的、随机数。例如checksum的值。可以用来快速构建fuzz的模版,并循环发送。

下面这个例子中,将对UDP 中的NTP协议进行fuzz。udp中的端口将被ntp覆盖成123,Ntp强制使用版本4,从udp中的内容起,除了上面说的两个内容,其他的值将为随机数。

>>> send(IP(dst="target")/fuzz(UDP()/NTP(version=4)),loop=1)
................^C
Sent 16 packets.

ps:最近我也在系统的看了写fuzz的内容,有机会写一系列fuzzing的学习文章。

发送 与接收

之前一直在发送,现在我们需要来接收一些回应了。
sr()方法用于发送包和接收响应,由于其总是返回一个unanswered packets(无响应包)。所以一般使用sr1()
这个变种,sr1()过滤掉了unanswered packets,显示更为有好。sr1()发送的包,必须为层3的包,
以为着必须要带着IP层的头。

>>> d=sr1(icmp)
Begin emission:
.Finished to send 1 packets.
...............................*
Received 33 packets, got 1 answers, remaining 0 packets
>>> d
<IP  version=4L ihl=5L tos=0x0 len=28 id=65475 flags= frag=0L ttl=46 proto=icmp chksum=0x1640 src=173.83.7.53 dst=192.168.1.173 options=[] |<ICMP  type=echo-reply code=0 chksum=0x0 id=0x0 seq=0x0 |<Padding  load='\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00' |>>>
>>>
>>> d.show()
###[ IP ]###
 version= 4L
 ihl= 5L
 tos= 0x0
 len= 28
 id= 65475
 flags=
 frag= 0L
 ttl= 46
 proto= icmp
 chksum= 0x1640
 src= 173.83.7.53
 dst= 192.168.1.173
 \options\
###[ ICMP ]###
 type= echo-reply
 code= 0
 chksum= 0x0
 id= 0x0
 seq= 0x0
###[ Padding ]###
 load= '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
>>>

利用sr1()来进行一次dns查询,202.106.0.20是网通的dns.查询本站的地址。示例如下,越来越有意思了吧。

>>> sr1(IP(dst="202.106.0.20")/UDP()/DNS(rd=1,qd=DNSQR(qname="www.d-up.org")))
Begin emission:
.Finished to send 1 packets.
*
Received 2 packets, got 1 answers, remaining 0 packets
<IP  version=4L ihl=5L tos=0x0 len=74 id=541 flags= frag=0L ttl=58 proto=udp chksum=0xf1b2 src=202.106.0.20 dst=192.168.1.173 options=[] |<UDP  sport=domain dport=domain len=54 chksum=0x877c |<DNS  id=0 qr=1L opcode=QUERY aa=0L tc=0L rd=1L ra=1L z=0L rcode=ok qdcount=1 ancount=1 nscount=0 arcount=0 qd=<DNSQR  qname='www.d-up.org.' qtype=A qclass=IN |> an=<DNSRR  rrname='www.d-up.org.' type=A rclass=IN ttl=65897 rdata='173.83.7.53' |> ns=None ar=None |>>>
>>>

前面学了sendp()用于发送2层的包,这里同样srp()用来发送2层(Ethernet, 802.3, etc)的包。
发送、接收包 是Scapy的重要功能,sr()最后一次返回的内容可以用 _(下划线) 获取,
他是一对值,包括发送的包,和接收的包(总是unanswered),所以一般不去处理第二个内容.
我们可以用两个变量获取这些内容,下面的示例:

>>> sr(IP(dst="192.168.1.172")/TCP(dport=[21,22,23]))
Begin emission:
.**Finished to send 3 packets.
*
Received 4 packets, got 3 answers, remaining 0 packets
(<Results: TCP:3 UDP:0 ICMP:0 Other:0>, <Unanswered: TCP:0 UDP:0 ICMP:0 Other:0>)
>>> ans,unnas=_
>>> ans.summary()
IP / TCP 192.168.1.173:ftp_data > 192.168.1.172:ftp S ==> IP / TCP 192.168.1.172:ftp > 192.168.1.173:ftp_data RA / Padding
IP / TCP 192.168.1.173:ftp_data > 192.168.1.172:ssh S ==> IP / TCP 192.168.1.172:ssh > 192.168.1.173:ftp_data RA / Padding
IP / TCP 192.168.1.173:ftp_data > 192.168.1.172:telnet S ==> IP / TCP 192.168.1.172:telnet > 192.168.1.173:ftp_data RA / Padding

注意:还需要说明的是sr1()前面我介绍了其过滤了这个 unanswered,因此返回一个值,所以取sr1()的结果用一个变量就可以了。
总结下,sr()和sr1()相比,个人觉得用还得用sr1()分析收到的包。

如果收到的包数量有限,你可以指定一个时间间隔来发送相邻的包。用inter参数来指定,如果有丢包现象,或者指定的时间间隔不够用,可以重新发送这些无响应包,除了再次调用发送函数发送无响应包外,还可以通过指定retry参数来实现,如果retry =3 ,那么sacpy将重新发送无响应包3次,如果retry=-3,scapy将重新发送无响应包直到 没有收到的同样无响应包超过3次以上。timeout参数用来指定从发送起等待的超时时间。

发送数据包的基础差不多就是这些了,后面将要学习一些简单的应用。

Scapy学习笔记.0×02-创造数据包

之前展示了scapy的安装启动等,并学习了ls命令,并创造了一个IP包,通过ls查看了创建的这个IP包的内容。现在看看创建、修改包的更多方法。

构造包


>>> a=IP(ttl=10)
>>> a
< IP ttl=10 |>
>>> a.src
’127.0.0.1’
>>> a.dst="192.168.1.1"
>>> a
< IP ttl=10 dst=192.168.1.1 |>
>>> a.src
’192.168.8.14’
>>> del(a.ttl)
>>> a
< IP dst=192.168.1.1 |>
>>> a.ttl
64

代码很清晰的介绍了,创建一个包的时候添加属性,查看包的某个内容。以及删除包中的内容,删除后恢复为默认值。

构造更复杂的包(包含多个层的包)

/ 操作符用来链接两不同层的包,其实就是把两个包的封装起来,比如一个IP层的包,当作包头加上一个TCP层的包。使用方法如下


>>> IP()
<IP |>
>>> IP()/TCP()
<IP frag=0 proto=TCP |<TCP |>>
>>> Ether()/IP()/TCP()
<Ether type=0x800 |<IP frag=0 proto=TCP |<TCP |>>>
>>> IP()/TCP()/"GET / HTTP/1.0\r\n\r\n"
<IP frag=0 proto=TCP |<TCP |<Raw load='GET / HTTP/1.0\r\n\r\n' |>>>
>>> Ether()/IP()/IP()/UDP()
<Ether type=0x800 |<IP frag=0 proto=IP |<IP frag=0 proto=UDP |<UDP |>>>>
>>> IP(proto=55)/TCP()
<IP frag=0 proto=55 |<TCP |>>

分析包

scapy提供了多种查看包结构并分析包的方法。支持抓包工具里常见的几种形式。看下面的代码:

>>> str(IP())
'E\x00\x00\x14\x00\x01\x00\x00@\x00|\xe7\x7f\x00\x00\x01\x7f\x00\x00\x01'
>>> IP(_)
<IP version=4L ihl=5L tos=0x0 len=20 id=1 flags= frag=0L ttl=64 proto=IP
 chksum=0x7ce7 src=127.0.0.1 dst=127.0.0.1 |>
>>>  a=Ether()/IP(dst="www.slashdot.org")/TCP()/"GET /index.html HTTP/1.0 \n\n"
>>>  hexdump(a)
00 02 15 37 A2 44 00 AE F3 52 AA D1 08 00 45 00  ...7.D...R....E.
00 43 00 01 00 00 40 06 78 3C C0 A8 05 15 42 23  .C....@.x<....B#
FA 97 00 14 00 50 00 00 00 00 00 00 00 00 50 02  .....P........P.
20 00 BB 39 00 00 47 45 54 20 2F 69 6E 64 65 78   ..9..GET /index
2E 68 74 6D 6C 20 48 54 54 50 2F 31 2E 30 20 0A  .html HTTP/1.0 .
0A                                               .
>>> b=str(a)
>>> b
'\x00\x02\x157\xa2D\x00\xae\xf3R\xaa\xd1\x08\x00E\x00\x00C\x00\x01\x00\x00@\x06x<\xc0
 \xa8\x05\x15B#\xfa\x97\x00\x14\x00P\x00\x00\x00\x00\x00\x00\x00\x00P\x02 \x00
 \xbb9\x00\x00GET /index.html HTTP/1.0 \n\n'
>>> c=Ether(b)
>>> c
<Ether dst=00:02:15:37:a2:44 src=00:ae:f3:52:aa:d1 type=0x800 |<IP version=4L
 ihl=5L tos=0x0 len=67 id=1 flags= frag=0L ttl=64 proto=TCP chksum=0x783c
 src=192.168.5.21 dst=66.35.250.151 options='' |<TCP sport=20 dport=80 seq=0L
 ack=0L dataofs=5L reserved=0L flags=S window=8192 chksum=0xbb39 urgptr=0
 options=[] |<Raw load='GET /index.html HTTP/1.0 \n\n' |>>>>

支持的命令如下:
Command            Effect
summary()            displays a list of summaries of each packet
nsummary()         same as previous, with the packet number
conversations()   displays a graph of conversations
show()                   displays the prefered representation (usually nsummary())
filter()                    returns a packet list filtered with a lambda function
hexdump()            returns a hexdump of all packets
hexraw()                returns a hexdump of the Raw layer of all packets
padding()              returns a hexdump of packets with padding
nzpadding()          returns a hexdump of packets with non-zero padding
plot()                      plots a lambda function applied to the packet list
make table()          displays a table according to a lambda function
可以看到,支持的显示形式非常丰富,我们几乎可以修改任何一个字段的内容。
如果包的内容很长,而一些内容我们没有修改过,我们只想查看我们修改过的内容,那么可以使用 hide_defaults() 这个函数来查看,它将不显示所以字段为默认值的字段。

>>> c.hide_defaults()
>>> c
<Ether dst=00:0f:66:56:fa:d2 src=00:ae:f3:52:aa:d1 type=0x800 |<IP ihl=5L len=67
 frag=0 proto=TCP chksum=0x783c src=192.168.5.21 dst=66.35.250.151 |<TCP dataofs=5L
 chksum=0xbb39 options=[] |<Raw load='GET /index.html HTTP/1.0 \n\n' |>>>>

导入PACP文件

可以使用Scapy查看抓包工具抓到的PACP文件,这个功能很方便。

>>> a=rdpcap("/spare/captures/isakmp.cap")
>>> a
<isakmp.cap: UDP:721 TCP:0 ICMP:0 Other:0>

生成图像

如果安装了Pyx库,则可以将包的结构导出为PDF形式的图像。

>>> a[423].pdfdump(layer_shift=1)
>>> a[423].psdump("/tmp/isakmp_pkt.eps",layer_shift=1)
效果很炫

生成一组包

前面都是手动生成了一个包,现在我们一次性多造点包。

>>> a=IP(dst="www.d-up.org/30")
>>> a
<IP  dst=Net('www.d-up.org/30') |>
>>> [p for p in a]
[<IP dst=66.35.250.148 |>, <IP dst=66.35.250.149 |>,
 <IP dst=66.35.250.150 |>, <IP dst=66.35.250.151 |>]
>>> b=IP(ttl=[1,2,(5,9)])
>>> b
<IP ttl=[1, 2, (5, 9)] |>
>>> [p for p in b]
[<IP ttl=1 |>, <IP ttl=2 |>, <IP ttl=5 |>, <IP ttl=6 |>,
 <IP ttl=7 |>, <IP ttl=8 |>, <IP ttl=9 |>]
>>> c=TCP(dport=[80,443])
>>> [p for p in a/c]
[<IP frag=0 proto=TCP dst=66.35.250.148 |<TCP dport=80 |>>,
 <IP frag=0 proto=TCP dst=66.35.250.148 |<TCP dport=443 |>>,
 <IP frag=0 proto=TCP dst=66.35.250.149 |<TCP dport=80 |>>,
 <IP frag=0 proto=TCP dst=66.35.250.149 |<TCP dport=443 |>>,
 <IP frag=0 proto=TCP dst=66.35.250.150 |<TCP dport=80 |>>,
 <IP frag=0 proto=TCP dst=66.35.250.150 |<TCP dport=443 |>>,
 <IP frag=0 proto=TCP dst=66.35.250.151 |<TCP dport=80 |>>,
 <IP frag=0 proto=TCP dst=66.35.250.151 |<TCP dport=443 |>>]

通过上面方法,可以很轻松的造出很多包。也可以很方便的将很多层的包封装起来。

包的构造基本学完了,下面该学习如何发送和接收包了。

相关文章列表:

第一篇 认识Scapy   http://d-up.org/man/2010/01/scapy0×1/

数据表示和分析-协议

什么是协议

在计算机两个端点建立活控制链接、通信或文件传输的约定或标准。

协议域

决定协议中的数据如何被分隔成不同的成分,以便对方按照协议约定去解释这些内容。常见的有三中方法:

A.定长域   (常用于网络协议)

B.变长域   (常用于多媒体,如视频)

C.分隔域   (简单文本协议,XML等)

简单文本协议 plain text protocol

通信数据的数据类型多为ASCII码。便于阅读,效率不高。

例如FTP、http,可以用发送字符串的方式完成操作。

二进制协议

传输的内容多为原始字节流。说白了就是指定位置指定内容,不理解该协议,对该协议中的数据包分析便无意义。只有理解了该协议,才能进行分析。效率较高。

文件格式

文件格式种类很多,实现方法各不相同,.odt文件有多个文件拼凑而成,而word文件为二进制文件。

常见的协议元素

以下在fuzzing中,均可以用来fuzzing。就是拿来破坏。

名字-值对  : size=13

块标识符   :块标记,后面跟着可变长或固定长度的数据

块长度        :用来标记长度,可参加Http协议

校验和        :主要用来保护数据完整性

小结:

这一章主要介绍了一般协议的构成,在fuzzing中,提前了解对象的构成会有莫大的帮助,尤其是开发协议。

ICMP

ICMP (Internet Control Message Protocol) Internet控制报文协议,在IP数据报内传输,格式如下:

|8位类型|8位代码|16位校验和|各种内容|

1.类型与代码

类型分为2大类,查询报文,差错报文。(为了防止处理产生的差错报文时不死循环)。
常见的ping请求,类型为8,ping回应的类型通常为0.类型和代码具体可查表,书中P 51。

ICMP 地址掩码请求与应答

类型为17或18.主要用于无盘系统在引导过程中获取自己的掩码,类似于RARP。

ICMP时间戳请求与应答

请求类型为13,应答类型为14.用于向另一个系统查询当前的时间,返回值为为午夜开始的毫秒值。因为返回的是毫秒数,因此日期需要通过其他方法获知。
包含3个时间戳,发起、接受、传送。同样接收这3个时间戳。通过这些数值可以计算出往返时间(rtt)

ICMP端口不可达差错报文

差错报文其实就是不可达报文,包含多种类型和情况。

windows快速添加右键CMD

打开“我的电脑”,点击菜单中的“工具”-“文件夹选项”,选择“文件类型”,找到“(无)资料夹”,点“高级”,“新建”,在“操作”中填入“Shell in This,“用于执行操作的应用程序”中填入“cmd.exe /k cd %1”(这个是关键),确定即可。