Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
scapy-docs-zh
提交
c941d6c6
S
scapy-docs-zh
项目概览
OpenDocCN
/
scapy-docs-zh
通知
0
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
S
scapy-docs-zh
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
c941d6c6
编写于
1月 22, 2017
作者:
W
wizardforcel
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
compelete
上级
174f207c
变更
6
展开全部
隐藏空白更改
内联
并排
Showing
6 changed file
with
2123 addition
and
1 deletion
+2123
-1
1.md
1.md
+1
-1
4.md
4.md
+805
-0
5.md
5.md
+106
-0
6.md
6.md
+951
-0
7.md
7.md
+73
-0
8.md
8.md
+187
-0
未找到文件。
1.md
浏览文件 @
c941d6c6
# 介绍
> 译者:[pdcxs007](http://blog.csdn.net/pdcxs007/
article/details/46686843
)
> 译者:[pdcxs007](http://blog.csdn.net/pdcxs007/)
> 来源:[Scapy介绍官方文档翻译](http://blog.csdn.net/pdcxs007/article/details/46686843)
...
...
4.md
0 → 100644
浏览文件 @
c941d6c6
此差异已折叠。
点击以展开。
5.md
0 → 100644
浏览文件 @
c941d6c6
# 构建你自己的工具
> 译者:[草帽小子_DJ](http://blog.csdn.net/dj1174232716/)
> 来源:[Python Scapy(2.3.1)文档学习(五):构建自己的工具](http://blog.csdn.net/dj1174232716/article/details/49046043)
> 原文:[Build your own tools](http://www.secdev.org/projects/scapy/doc/extending.html)
> 协议:[CC BY-NC-SA 2.5](http://creativecommons.org/licenses/by-nc-sa/2.5/)
你可以使用Scapy构建你自己的自动化工具。你也可以扩展Scapy而不必编辑它的源文件。如果你构建了一些有趣的工具,请捐献给我们的邮件列表。
## 在你的工具中使用Scapy
你可以很容易的在你的工具中使用Scapy,只需要导入你需要的便可以使用。
第一个例子是传入一个IP或者一个主机名作为参数,发送一个ICMP响应请求,然后显示返回包完整的构造。
```
py
#! /usr/bin/env python
import
sys
from
scapy.all
import
sr1
,
IP
,
ICMP
p
=
sr1
(
IP
(
dst
=
sys
.
argv
[
1
])
/
ICMP
())
if
p
:
p
.
show
()
```
找个有一个更加灵活的例子,就是生成一个ARP的ping包,并用LaTeX格式报告它所发现的东西。
```
py
#! /usr/bin/env python
# arping2tex : arpings a network and outputs a LaTeX table as a result
import
sys
if
len
(
sys
.
argv
)
!=
2
:
print
"Usage: arping2tex <net>
\n
eg: arping2tex 192.168.1.0/24"
sys
.
exit
(
1
)
from
scapy.all
import
srp
,
Ether
,
ARP
,
conf
conf
.
verb
=
0
ans
,
unans
=
srp
(
Ether
(
dst
=
"ff:ff:ff:ff:ff:ff"
)
/
ARP
(
pdst
=
sys
.
argv
[
1
]),
timeout
=
2
)
print
r
"\begin{tabular}{|l|l|}"
print
r
"\hline"
print
r
"MAC & IP\\"
print
r
"\hline"
for
snd
,
rcv
in
ans
:
print
rcv
.
sprintf
(
r
"%Ether.src% & %ARP.psrc%\\"
)
print
r
"\hline"
print
r
"\end{tabular}"
```
这有另外一个工具,它将时刻监控机器上的所有的网卡并打印所有的ARP请求。即使是混杂模式下的无线网卡上的801.11数据帧。注意,
`sniffer()`
函数的参数
`store=0`
是为了避免将所有的数据包存储在内存。
```
py
#! /usr/bin/env python
from
scapy.all
import
*
def
arp_monitor_callback
(
pkt
):
if
ARP
in
pkt
and
pkt
[
ARP
].
op
in
(
1
,
2
):
#who-has or is-at
return
pkt
.
sprintf
(
"%ARP.hwsrc% %ARP.psrc%"
)
sniff
(
prn
=
arp_monitor_callback
,
filter
=
"arp"
,
store
=
0
)
```
这里有一个生活中真实的例子,你可以参考WiFitap(
[
http://sid.rstack.org/static/articles/w/i/f/Wifitap_EN_9613.html
](
http://sid.rstack.org/static/articles/w/i/f/Wifitap_EN_9613.html
)
).
## 扩展Scapy
如果你想添加一些新的协议,新的函数,或者任何东西,你可以直接编辑Scapy的源代码。但是这是非常不方便的。即使这些修改将会整合到Scapy中去。可以更加方便的编写他们在单独的文件中。
一旦你这么做了,你可以启动Scapy并导入自己的文件,但是这还是不是很方便,另外一个能做到这一点的方法是让你文件执行并且调用Scapy的
`interact()`
函数。
```
py
#! /usr/bin/env python
# Set log level to benefit from Scapy warnings
import
logging
logging
.
getLogger
(
"scapy"
).
setLevel
(
1
)
from
scapy.all
import
*
class
Test
(
Packet
):
name
=
"Test packet"
fields_desc
=
[
ShortField
(
"test1"
,
1
),
ShortField
(
"test2"
,
2
)
]
def
make_test
(
x
,
y
):
return
Ether
()
/
IP
()
/
Test
(
test1
=
x
,
test2
=
y
)
if
__name__
==
"__main__"
:
interact
(
mydict
=
globals
(),
mybanner
=
"Test add-on v3.14"
)
```
如果你运行上面的代码,便会得到下面的结果:
```
# ./test_interact.py
Welcome to Scapy (0.9.17.109beta)
Test add-on v3.14
>>> make_test(42,666)
<Ether type=0x800 |<IP |<Test test1=42 test2=666 |>>>
```
\ No newline at end of file
6.md
0 → 100644
浏览文件 @
c941d6c6
此差异已折叠。
点击以展开。
7.md
0 → 100644
浏览文件 @
c941d6c6
# 常见问题
> 译者:[飞龙](https://github.com/wizardforcel)
> 原文:[Troubleshooting](http://www.secdev.org/projects/scapy/doc/troubleshooting.html)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
## 我的 TCP 连接被 Scapy 或者是我的内核重置了
内核不知道 Scapy 在他背后做什么。 如果 Scapy 发送 SYN,目标回复 SYN-ACK,并且你的内核看到它,它将回复 RST。 为了防止这种情况,请使用本地防火墙规则(例如 Linux 上的 NetFilter)。 Scapy 不介意本地防火墙。
## 我 Ping 不通 127.0.0.1,Scapy 在 127.0.0.1 上或是本地回送接口上不工作
回送接口是一个非常特殊的接口。 通过它的数据包没有真正组装和拆卸。 内核将数据包路由到其目的地,而它仍然存储于内部结构中。 你看到的
`tcpdump -i lo`
只是假的,让你认为一切正常。 内核不知道 Scapy 在背后做什么,所以你在回送接口上看到的也是假的。 这个是不会在本地结构中的,因此内核永远不会收到它。
为了和本地的程序交流,你应该在上层协议中构建你的数据包。使用
`PF_INET/SOCK_RAW`
套接字而不是
`PF_PACKET/SOCK_RAW`
```
py
>>>
conf
.
L3socket
<
class
__main__
.
L3PacketSocket
at
0xb7bdf5fc
>
>>>
conf
.
L3socket
=
L3RawSocket
>>>
sr1
(
IP
(
dst
=
"127.0.0.1"
)
/
ICMP
())
<
IP
version
=
4L
ihl
=
5L
tos
=
0x0
len
=
28
id
=
40953
flags
=
frag
=
0L
ttl
=
64
proto
=
ICMP
chksum
=
0xdce5
src
=
127.0
.
0.1
dst
=
127.0
.
0.1
options
=
''
|<
ICMP
type
=
echo
-
reply
code
=
0
chksum
=
0xffff
id
=
0x0
seq
=
0x0
|>>
```
## BPF 过滤器在 PPP 链路上不能工作
这是一个已知的 bug。BPF 过滤器必须在 PPP 链路上以不同的偏移来编译。如果你使用
`libpcap`
(将用来编译 BFP 过滤器),而不是使用 Linux 本地的支持(
`PF_PACKET`
套接字),他可能会工作。
## `traceroute()`在 PPP 链路上不能工作
这是一个已知的 bug,BPF 过滤器在 PPP 链路上不能工作。
为了能让他正常工作,使用
`nofilter=1`
:
```
>>> traceroute("target", nofilter=1)
```
## 画图太丑,字体太大,图片被截断
快速修复:用 png 格式
```
>>> x.graph(format="png")
```
## 更新 GraphViz 的最新版本
尝试提供不同的 DPI 选项(比如说:50,70,75,96,101,125):
```
>>> x.graph(options="-Gdpi=70")
```
如果它工作了,你可以永久设置它:
```
>>> conf.prog.dot = "dot -Gdpi=70"
```
你也可以将这一行放在你的
`~/.scapy_startup.py`
文件中。
## 获取帮助
常见问题都在 FAQ 中。
在
`scapy.ml(at)secdev.org`
(
[
归档
](
http://news.gmane.org/gmane.comp.security.scapy.general
)
,
[
RSS,NNTP
](
http://gmane.org/info.php?group=gmane.comp.security.scapy.general
)
)上有一个低流量邮件列表。 我们鼓励你向此列表发送问题,错误报告,建议,想法,Scapy 的有趣用法等。 通过发送邮件到
`scapy.ml-subscribe(at)secdev.org`
来订阅。
为了避免垃圾邮件,你必须订阅邮件列表才能发布。
8.md
0 → 100644
浏览文件 @
c941d6c6
# Scapy 开发
> 译者:[飞龙](https://github.com/wizardforcel)
> 原文:[Scapy development](http://www.secdev.org/projects/scapy/doc/development.html)
> 协议:[CC BY-NC-SA 4.0](http://creativecommons.org/licenses/by-nc-sa/4.0/)
## 项目组织
Scapy 开发使用 Mercurial 版本控制系统。 Scapy 的参考资料库位于
<http://hg.secdev.org/scapy/>
。
项目管理由 Trac 完成。 Trac 在 Scapy 的参考资料库中工作。 它提供了一个可以自由编辑的 Wiki(请贡献!),可以引用项目的 ticket,变更集,文件。 它还提供了一个 ticket 管理服务,用于避免遗忘补丁或错误。
Mercurial 的分布式工作方式使 Philippe 可提供两个仓库,任何人都可以提交:Scapy
[
社区仓库
](
http://hg.secdev.org/scapy-com
)
和 Scapy
[
Windows 端口仓库
](
http://hg.secdev.org/scapy-com
)
。
## 如何贡献
+
在 Scapy 中发现了一个错误?
[
添加 ticket
](
http://trac.secdev.org/scapy/newticket
)
。
+
改进此文档。
+
编程一个新的协议层,并在邮件列表上分享。或者在 bugtracker 上将其添加为改进。
+
贡献新的
[
回归测试
](
http://trac.secdev.org/scapy/wiki/RegressionTests
)
。
+
在
[
封包样例
](
http://trac.secdev.org/scapy/wiki/PacketsSamples
)
页面上为新协议上传封包样例。
## 使用 UTScapy 测试
### 什么是 UTScapy?
UTScapy 是一个小型 Python 程序,它读取测试活动,使用 Scapy 运行活动,并生成一个指示测试状态的报告。报告可以是四种格式之一,即 text,ansi,HTML 或 LaTeX。
UTScapy 存在三个基本测试容器,单元测试,测试集和测试活动。单元测试是 Scapy 命令列表,由 Scapy 或 Scapy 的派生作品运行。在单元测试中最后一个命令的评估,将确定单个单元测试的最终结果。测试集是一组具有某种关联的单元测试。测试活动由一或多个测试集组成。测试集和单元测试可以被赋予关键字来形成逻辑分组。运行测试活动时,可以按关键字选择测试。这允许用户在期望的分组内运行测试。
对于每个单元测试,测试集和活动,测试的 CRC32 被计算并显示为该测试的签名。该测试签名足以确定实际测试按预期运行而没有修改。如果你遇到的一些恶意用户,试图修改或损坏文件,而不改变 CRC32,全局 SHA1 会在整个文件计算。
### 活动的语法
表 1 显示了 UTScapy 正在寻找的语法指标。 在定义测试的文本文件的每一行中,语法限定符必须是第一个字符。 由 UTScapy 解释的参数是遵循语法限定符的文本描述。 在没有前导语法限定符的情况下出现的行将被视为 Python 命令,前提是它们出现在单元测试的上下文中。 没有语法限定符,并出现在正确上下文之外的行将被 UTScapy 拒绝,并且将发出警告。
| 语法限定符 | 定义 |
| --- | --- |
|
`%`
| 提供测试活动的名称 |
|
`+`
| 声明新的测试集 |
|
`=`
| 声明新的单元测试 |
|
`~`
| 为当前单元测试声明关键字 |
|
`*`
| 表示需要在报告中包含的注释 |
|
`#`
| 测试用例的注解,会被解释器忽略 |
表 1 - UTScapy 语法限定符
在测试报告中的注释有一个上下文。 每个注释将与最后定义的测试容器相关联 - 这是单个单元测试,测试集或测试活动。 与特定容器相关联的多个注释将连接在一起,并将直接显示在测试容器声明后的报告中。 在声明测试活动之前,应该会显示测试文件的一般注释。 对于与测试活动相关联的注释,它们必须位于声明测试活动之后,但在任何测试集或单元测试之前出现。 测试集的注释应在集合的第一个单元测试的定义之前出现。
测试活动的通用格式如下表所示:
```
% Test Campaign Name
* Comment describing this campaign
+ Test Set 1
* comments for test set 1
= Unit Test 1
~ keywords
* Comments for unit test 1
# Python statements follow
a = 1
print a
a == 1
```
Python 语句由缺少定义的 UTScapy 语法限定符来标识。 Python 语句直接提供给 Python 解释器,就像在交互式 Scapy shell(交互)中操作一样。循环,迭代和条件是允许的,但必须以空行终止。测试集可以包括多个单元测试,并且可以为每个活动定义多个测试集。甚至可以在特定测试定义文件中包含多个测试活动。使用关键字可以测试整个活动的子集。例如,在测试活动的开发期间,用户可能希望使用关键词“debug”来标记正在开发的新测试。一旦测试成功运行出他们想要的结果,关键字“debug”可以被删除。也可以使用诸如“regression”或“limited”的关键词。
重要的是要注意,UTScapy 使用来自最后一个 Python 语句的真值作为测试是通过还是失败的指示符。最后一行可能出现多个逻辑测试。如果结果为 0 或
`False`
,则测试失败。否则,测试通过。如果需要,使用
`assert()`
语句可以强制中间值的求值。
UTScapy 的语法如表 3 所示 - UTScapy 命令行语法:
```
[root@localhost scapy]# ./UTscapy.py –h
Usage: UTscapy [-m module] [-f {text|ansi|HTML|LaTeX}] [-o output_file]
[-t testfile] [-k keywords [-k ...]] [-K keywords [-K ...]]
[-l] [-d|-D] [-F] [-q[q]]
-l : generate local files
-F : expand only failed tests
-d : dump campaign
-D : dump campaign and stop
-C : don't calculate CRC and SHA
-q : quiet mode
-qq : [silent mode]
-n <testnum> : only tests whose numbers are given (eg. 1,3-7,12)
-m <module> : additional module to put in the namespace
-k <kw1>,<kw2>,... : include only tests with one of those keywords (can be used many times)
-K <kw1>,<kw2>,... : remove tests with one of those keywords (can be used many times)
```
表 3 - UTScapy 命令行语法
所有参数都是可选的。 没有相关联的参数值的参数可以串在一起(即
`-lqF`
)。 如果未指定测试文件,则测试定义来自
`<STDIN>`
。 类似地,如果没有指定输出文件,则它被定向到
`<STDOUT>`
。 默认输出格式为“ansi”。 表 4 列出了参数,相关联的参数值及其对 UTScapy 的含义。
| 参数 | 参数值 | 对 UTScapy 的含义 |
| --- | --- |
| -t |
`testfile`
| 定义测试活动的测试文件(默认为
`<STDIN>`
) |
| -o |
`output_file`
| 测试活动结果的输出文件(默认为
`<STDOUT>`
) |
| -f |
`test`
|
`ansi`
,
`HTML`
,
`LaTeX`
,输出报告的格式(默认为
`ansi`
) |
| -l | | 在本地生成报告的相关文件。对于 HTML,生成 JavaScript 和样式表 |
| -F | | 默认情况下,失败的测试用例会在 HTML 输出中展开 |
| -d | | 在执行活动之前打印测试活动的简短列表。 |
| -D | | 打印测试活动的简短列表并停止。不执行测试活动。 |
| -C | | 不要计算测试签名 |
| -q | | 在测试执行时,不要在屏幕上显示测试流程 |
| -qq | | 静默模式 |
| -n |
`testnum`
| 只执行由数字列出的这些测试。 测试编号可以使用
`–d`
或
`–D`
来获取。测试可以使用以逗号分隔的列表来列出,并且可以包含范围(例如 1, 3-7, 12)。 |
| -m |
`module`
| 在执行测试之前加载模块。 使用 Scapy 的派生作品来测试。 注意:要作为
`__main__`
执行的派生作品不会被 UTScapy 作为
`__main__`
调用。 |
| -k |
`kw1, kw2, ...`
| 只包含带有关键字
`kw1`
的测试,可以指定多个关键字。 |
| -K |
`kw1, kw2, ...`
| 排除带有关键字
`kw1`
的测试,可以指定多个关键字。 |
表 4 - UTScapy 参数
表 5 显示了具有多个测试集定义的简单测试活动。 此外,关键字指定了仅允许执行有限数量的测试用例。 注意在测试 3 和 5 中使用
`assert()`
语句来检查中间结果。 测试 2 和 5 为失败而设计。
```
% Example Test Campaign
# Comment describing this campaign
#
# To run this campaign, try:
# ./UTscapy.py -t example_campaign.txt -f html -o example_campaign.html -F
#
* This comment is associated with the test campaign and will appear
* in the produced output.
+ Test Set 1
= Unit Test 1
~ test_set_1 simple
a = 1
print a
= Unit test 2
~ test_set_1 simple
* this test will fail
b = 2
a == b
= Unit test 3
~ test_set_1 harder
a = 1
b = 2
c = "hello"
assert (a != b)
c == "hello"
+ Test Set 2
= Unit Test 4
~ test_set_2 harder
b = 2
d = b
d is b
= Unit Test 5
~ test_set_2 harder hardest
a = 2
b = 3
d = 4
e = (a * b)**d
# The following statement evaluates to False but is not last; continue
e == 6
# assert evaluates to False; stop test and fail
assert (e == 7)
e == 1296
= Unit Test 6
~ test_set_2 hardest
print e
e == 1296
```
为了查看以 Scapy 为目标的示例,请访问
<http://www.secdev.org/projects/UTscapy>
。将页面底部的示例复制粘贴到文件
`demo_campaign.txt`
,并对它运行 UTScapy:
```
./UTscapy.py -t demo_campaign.txt -f html -o demo_campaign.html –F -l
```
在文件
`demo_campaign.html`
中检测生成的结果。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录