在实际开发过程中,熟练使用Linux或者Windows中相关网络工具,可以更快更准地找到故障。所以,今天就跟大家分享几个实用的网络利器。 1 ncnc-->“瑞士军刀”。不知大家在渗透过程中,拿了shell有没有使用nc搞点事儿。它用来快速构建网络链接,常用来调试客户端程序。
nc参数举例 [td]执行任务 | 命令 | | 扫描机器A端口号在30-40的服务 | nc -z A 30-40 | | 连接服务器A端口号为5000 | nc -C A 5000 | | 传送文件 | MachineA:nc -v -n ip portE:\a.exe | 2 ping用来实现对网络连通性探测。我们知道网络上机器有唯一确定的IP地址,给对方发送数据包,根据返回的信息初步判断目标机器是否存在或者目标机器操作系统是啥。那么,经常使用的ping,底层原理是什么,是TCP/UDP?
+ g: ^6 x/ l$ M, A& Y
ping在具体实现中,其实使用了ICMP协议(网际控制报文协议),它是一种基于IP协议的控制协议。那么,ICMP协议(网际控制报文协议),其报文什么样子呢? 2 E1 l8 L8 K4 S% u! u3 @) ^" ~& V
下面分别阐述下字段含义: ping命令组装成上述的IP报文进行发送,报文目的地为ping目的地址,原地址为发送ping主机地址,然后按照ICMP的规则填写数据。 随后IP报文通过ARP协议,请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址。 查看详细参数
# r7 U" s3 h* o9 m6 Z# I3 L! t8 Lping参数常用参数
7 Q z2 C6 C* r/ A* x' I% ^ [-l] :定义所发送数据包的大小,默认为32字节。 [-n] :定义所发数据包的次数,默认为3次。 [-t] :表示不间断向目标IP发送数据包。 TTL TTL 是 IP 协议包中的一个值,它告诉网络路由器,包在网络中的时间是否太长而应被丢弃。
& q# E* i2 K# B8 f& \7 z/ a" h
返回值 Request timed out 可能出现的情况: -对方已经关机或者根本没有这个地址。 -可能不在同一个网段,即使通过路由也无法找到对方从而出现超时。 -对方存在但是设置了防火墙过滤。 " @* Q; o3 V) S2 z+ `' e- ~
Destination host Unreachable 可能出现的情况: -与对方不在同一个网段且没有设置默认路由 -网线出毛病
) s' k+ h' u" w4 P H1 D6 b
Bad IP address 可能出现的情况: -IP地址不存在 -没有正确连接DNS服务器从而无法解析
% T5 e7 F+ z! T! `0 `$ }4 F4 U: Q 3 ifconfig/ip addr查看服务器网卡、IP等信息。
8 Q/ k& |2 U( G F' {5 m
ipaddr上图中被马赛克的位置假设为10.172.100.3,这样就是一个IP地址,IP地址按照小数点分割为四部分,每部分占8字节,所以IP地址为32位。 那么,这样的IP地址一共有多少呢?一共有2的32次方个,估算约为42.9亿个,除去一些特用的IP和一些不能用的IP,剩下可用的不到40亿。为解决网络地址资源不足的问题,从而出现IPV6,128位的IP地址。 刚开始觉得32位很够用了,还将其分为5类,如下图所示:
8 |( x) X0 l2 q- x( B9 j) P. k9 r2 c网络地址分类我们再看看各类地址的主机数量是多少? 4 J1 L( Z6 ` ?5 w( s
上图中可知道C类地址太少了吧,但是B类地址又太多,怎么中和一下嘞? 无类型域间选路 CIDR地址中包含标准的32位IP地址和有关网络前缀位数的信息。比如10.172.100.3/24,IP地址斜杠后面数字24,代表前24位是网络号,后面8位为主机号。
如何得到网络号? 使用IP地址和子网掩码进行AND计算得到网络号。 4 tcpdump和它类似的工具在windows中是wireshark,其采用底层库winpcap/libpcap实现,采用了bpf过滤机制。下面我们看看提供的不同参数的含义。
tcpdump知道了相关参数,下面看几个案例。 [td]执行任务 | 命令 | | 捕获特定网口数据包 |
' |- S4 \$ u P5 \9 |( Q$ e1 btcpdump -i eth0 | | 捕获特定个数(1000)的包 | tcpdump -c 1000 -i eth0 | | 将捕获的包保存到文件 | tcpdump -w a.pcap -i eth0 | | 读取pcap格式的包 | tcpdump -r a.pcap | | 增加捕获包的时间戳 | tcpdump -n -ttt -i eth0 | | 指定捕获包的协议类型 | tcpdump -i eth0 arp | | 捕获指定端口 | tcpdump -i eth0 post 22 | | 捕获特定目标ip+port的包 | tcpdump -i eth0 dst address and port 22 | | 捕获DNS请求和响应 | tcpdump -i eth0 -s0 port 53 | | 匹配Http请求头 | tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:" | 5 lsof列出当前系统打开的文件描述符工具,可以得知感兴趣的描述符是被哪些进程使用。
同样,我们看看相关参数:
lsof举例 [td]执行任务 | 命令 | | 列出所有的网络链接 | lsof -i | | 列出所有udp的网络链接 | lsof -i udp | | 列出谁在使用某个端口 | lsof -i :3306 | | 列出谁在使用特定的tcp端口 | lsof -i tcp:80 | | 根据文件描述范围列出文件信息 | lsof -d 2-3 | 6 netstatnetstat是一个网络信息统计工具。它可以得到网卡接口上全部链接、路由表信息、网卡接口信息等。通常在网络编程中我们用它来显示TCP连接以及状态信息。
. \ Q4 H7 G, b! s! B2 @( e% j5 @下面列举几个常用例子。 [td]执行任务 | 命令 | | 列出所有连接 | netstat -a | | 只列出TCP或者UDP | netstat -at/netstat -au | | 列出监听中的连接 | netstat -tnl | | 获取进程名、进程号以及用户ID | nestat -nlpt | | 打印统计信息 | netstat -s | | netstat持续输出 | netstat -ct | | 打印active状态的连接 | netstat -atnp | grep ESTA | | 查看服务是否运行(npt) | netstat -aple| grep ntp |
7 dpkt dpkt定义包packet类,它定义了网络报文类型的基础类。其中IP、ICMP等继承于dpkt class,每一个子类有一个_hdr_结构,此结构定义了不同报文的头部,方便取出相应的控制字段。示例如下: #!/usr/bin/python Z. a7 |2 r8 }6 R
#coding=utf-8. v: F; Y2 x% }) Z3 z
import dpkt
1 Y* l9 n4 T. ^import socket
6 y( `/ M s# u! M; a& k9 S/ s2 @import optparse
: H R. V& t* w
% `: Q( {% Z# X& o1 L. J9 }def printPcap(pcap):
5 w" n k6 t' K # 遍历[timestamp, packet]记录的数组2 S x5 k' A" f
for (ts, buf) in pcap:( Y- L' b" ]' i; I; H5 B3 c4 w
try:# z9 ?& d: I9 ]" l. Q: j& V
# 获取以太网部分数据# ?1 A2 x1 h1 }) ~% H* m
eth = dpkt.ethernet.Ethernet(buf)
% U$ W; T: n9 K9 E # 获取IP层数据
9 X7 f4 W) M+ F6 X; Q* C ip = eth.data
6 Y3 F9 `# R$ _$ p3 j; J4 M # 把存储在inet_ntoa中的IP地址转换成一个字符串
$ D% t5 x1 H/ U6 Q1 | src = socket.inet_ntoa(ip.src), V' s. J( H9 [ n& j- `* O6 ?: g9 _
dst = socket.inet_ntoa(ip.dst)9 T3 p8 N+ u# e3 ^7 i: p
print '[+] 源地址: ' + src + ' --> 目标地址: ' + dst
|7 t+ ?) U% `* u) V except:
b% l8 g, r' d; C% X4 v; n pass0 ]0 T* Y- k: k' C9 H( e% m2 n3 U
! a0 L g1 M" o) q/ `def main():
9 g0 m' m- y; f& F9 i' [ parser = optparse.OptionParser(' Usage : ./pcapTest.py -f <file>')#测试包 ~2 Z |! e! _
parser.add_option('-f',dest='fileName',type='string',help='specify target filename')
6 A" ^4 w, B* G1 f8 d (options,args) = parser.parse_args()
9 Y% `3 @4 [; ~- N W# V4 H fileName = options.fileName# 取得包名
0 {7 a' c E1 u- v
0 h, M# A6 i. \" E& z if fileName == None:9 E8 p9 I8 e' E) x, n/ ^+ G
print parser.usage8 o; k+ t8 E/ N o% X
exit(0) Z1 B5 Z% Q0 C6 p7 B' R$ q
else:, e: s* i" X- W+ o5 h* S V" ~
#f = open('geotest.pcap')
) _4 i( a3 ]6 k/ _' y7 Y f = open(fileName)% ^+ K [. N( _& q
pcap = dpkt.pcap.Reader(f)
5 A7 R6 D/ {$ i7 _ printPcap(pcap)
$ H" U( w7 k3 k r2 D2 u# ?
- h# d1 Z# r% C# ?4 M. i* S+ V! xif __name__ == '__main__':* j- C! R; Z5 e, J, A1 X
main()
& @. X! R- q6 c/ j8 scapy注意哈,这个是嗅探包,不是爬虫框架scrapy哈。看看官网怎么说的,如“强大的交互式包操作工具”、“支持大量协议的包解析和包构造”、“轻松取代hping,85%的nmap,arpspoof,tcpdump等等”。不过归根到底,它说的强大功能,都是基于Scapy是一个强大的网络数据包操作工具才能实现得了的。这里只是大概介绍,具体用法官网非常详细,有助于学习网络协议。
: }2 @3 n" T& Y* n! ^" R. \1 W/ a% \7 C( k9 ~
|