Wireshark如何捕获网络流量数据包

导语:在本文中,您将学习使用Wireshark捕获攻击者使用NMAP扫描时的网络数据包。这里您会注意到,Wireshark如何捕获不同的网络流量数据包,用于打开和关闭端口。

在本文中,您将学习使用Wireshark捕获攻击者使用NMAP扫描时的网络数据包。这里您会注意到,Wireshark如何捕获不同的网络流量数据包,用于打开和关闭端口。

TCP扫描

Tcp扫描将像端口22.21.23.44等扫描TCP端口,并通过源端口和目的端口之间的三次握手连接确保监听端口(打开)。如果端口打开,则使用SYN数据包发送请求,响应目的地发送SYN,ACK数据包然后发送ACK数据包,最后源再次发送RST,ACK数据包。

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -T -p 445 192.168.1.102

从给定的图像可以观察结果端口445是开放的。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序。

您会注意到它已经捕获了与上述相同的标志序列:

  • 源发送SYN包到目的地

  • 目的地发送SYN,ACK到源

  • 源发送ACK包到目的地

  • 源再次发送RST,ACK到目的地

未分类

我们来看一下关闭端口的网络流量。根据给定的图像,显示扫描端口是否关闭,则源和目的地之间将无法进行3路握手连接。

源发送SYN包,如果端口关闭,接收方将通过RST,ACK发送响应。

未分类

键入以下NMAP命令进行TCP扫描,然后启动Wireshark捕获发送的数据包。

nmap -T -p 3389 192.168.1.102

从给定的图像可以观察结果端口3389被关闭。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序。您会注意到它已经捕获了与上述相同的标志序列:

源发送SYN包到目的地

目的地发送RST,ACK包到源

未分类

隐形扫描

SYN扫描是默认和最受欢迎的扫描选项,有很好的理由。它可以快速执行,在不受限制性防火墙阻碍的快速网络上每秒扫描数千个端口。它也是相对典型和隐秘的,因为它从未完成TCP连接。如果接收到SYN数据包(没有ACK标志),端口也被视为打开。

这种技术通常被称为半开放扫描,因为您没有打开完整的TCP连接。您发送一个SYN数据包,就好像要打开一个真实的连接,然后等待响应。SYN,ACK表示端口正在侦听(打开)

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -sS -p 22 192.168.1.102

从给定的图像可以观察结果端口22是开放的。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

源发送SYN数据包到目的地

目的地发送SYN,ACK数据包到源

源发送RST报文到目的地

未分类

现在,利用隐形扫描计算出关闭端口的流量。当源在特定端口发送SYN数据包时,如果端口关闭,则目的地将通过发送RST数据包进行回复。

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -sS -p 3389 192.168.1.102

从给定的图像可以观察结果端口3389被关闭。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

源发送SYN数据包到目的地

目的地发送RST,ACK包到目的地

未分类

碎片扫描

通常在数据传输完成后,FIN数据包终止源端和目标端口之间的TCP连接。代替SYN数据包,Nmap通过使用FIN数据包开始FIN扫描。如果端口打开,则通过源端口发送FIN数据包时,目的端口不会响应。

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -F -p 22 192.168.1.102

从给定的图像可以观察结果端口22是开放的。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

  • 源发送FIN包到目的地

  • 目的地不发送回复来源

未分类

类似地,如果针对任何关闭执行Fin扫描,则源端口将向特定端口发送FIN数据包,并且目的地将通过发送RST,ACK数据包进行回复。

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -F -p 3389 192.168.1.102

从给定的图像可以观察结果端口3389是接近。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

  • 源发送SYN数据包到目的地

  • 目的地发送RST报文到目的地

未分类

空扫

空扫描是一系列TCP数据包,保存序列号为“0”(0000000),并且由于没有设置任何标志,目的地将不知道如何回复请求。它将丢弃数据包,并且不会发送回复,这表示端口是打开的。

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -sN -p 22 192.168.1.102

从给定的图像可以观察结果端口22是开放的。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

  • 源发送Null数据包到目的地

  • 目的地不发送回复来源

未分类

如果端口关闭,则当源在特定端口发送空数据包时,目的地将发送RST,ACK数据包

未分类

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -F -p 3389 192.168.1.102

从给定的图像可以观察结果端口3389是接近。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

  • 源发送Null(无)数据包到目的地

  • 目的地发送RST,ACK到源

未分类

UDP扫描

UDP扫描通过向每个目的端口发送UDP数据包来工作; 它是一个连接少协议。对于一些常见的端口如53和161,发送协议特定的有效载荷以增加响应速率,服务将使用UDP数据包进行响应,证明它是开放的。如果在重传后没有收到响应,则端口被分类为打开|过滤。这意味着端口可能是打开的,或者可能包过滤器阻塞通信。

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -sU -p 161 192.168.1.119

从给定的图像可以观察结果端口161是开放的。

未分类

查看通过Wireshark捕获的源和目标之间的数据包传输顺序

  • 源UDP发送到目的地址

  • 目的地向源发送一些数据的UDP数据包

未分类

类似地,如果源端口发送UDP报文到目的端,则目的地发送回应ICMP报文端口不可达到适当的错误。

未分类

键入以下NMAP命令进行TCP扫描,然后启动Wireshark捕获发送的数据包。

nmap -sU -p 53 192.168.1.119

从给定的图像可以观察结果端口53是接近。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

  • 源UDP发送到目的地址

  • 目的地发送ICMP报文端口不可达源

未分类

圣诞扫描

这些扫描被设计为操纵TCP标头的PSH,URG和FIN标志,设置FIN,PSH和URG标志,照亮数据包像圣诞树。当源将FIN,PUSH和URG数据包发送到特定端口时,如果端口打开,则目的地将丢弃数据包,不会对源发送任何回复。

未分类

键入以下NMAP命令进行TCP扫描,然后启动wireshark捕获发送的数据包。

nmap -sX -p 22 192.168.1.102

从给定的图像可以观察结果端口22是开放的。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

  • 来源将FIN,PUSH和URG数据包发送到目的地

  • 目的地不发送回复来源

未分类

类似地,如果源将FIN,PUSH和URG数据包发送到特定端口,并且如果端口被关闭,则目的地将向源发送RST,ACK数据包。

未分类

键入以下NMAP命令进行TCP扫描,然后启动Wireshark捕获发送的数据包。

nmap -sX -p 3389 192.168.1.102

从给定的图像可以观察结果端口3389是接近。

未分类

查看通过wireshark捕获的源和目的地之间的数据包传输顺序

  • 来源将FIN,PUSH和URG数据包发送到目的地

  • 目的RST,ACK包到源

未分类

VirtualBox硬盘镜像压缩 减小体积

缘起

罪魁祸首依然是mac,自从换了MBP,硬盘空间真的是捉襟见肘。由于需要看Android源码,搞了个Ubuntu虚拟机来编译源码,源码所在的硬盘镜像非常的大,一度达到40G,这在空间不足的情况下是不能忍的。

然后翻了下Android源码的镜像盘的物理文件居然比系统里实际的大小要大不少,这怎么能忍。。。。。。分析后发现,virturabox居然只会增大分配磁盘空间,居然不会自动释放空间,同时不提供对虚拟磁盘的释放操作界面,简直蠢。。。。。

好在搜索之后发现,virtualbox提供了命令行压缩磁盘的操作,那么就可以通过命令行操作曲线救国了,只是比较麻烦就是了。

操作

指导思想

1、虚拟机: 清理系统,卸载、删除系统垃圾文件

2、虚拟机: 将磁盘数据靠“前”移动,并将剩余磁盘空间写“零”

3、物理主机: 清除“零”字节空间,使用 VBoxManage modifyhd 工具压缩 VDI 磁盘镜像文件

Windows 虚拟机

1、虚拟机: 删除系统垃圾文件,运行磁盘整理程序…

2、虚拟机: 用 SDelete 工具写”零”,下载地址 http://technet.microsoft.com/en-us/sysinternals/bb897443.aspx,在命令行下执行 “sdelete -c <盘符>”… 关机…(如果是多个磁盘,请加上不同的盘符分别执行)

3、物理主机: 执行 “VBoxManage modifyhd /the-path-of-VDI.vdi –compact”

Linux 虚拟机

1、虚拟机: 清理、卸载系统垃圾文件

2、填0操作(如果是多个盘,请分别执行)

sudo dd if=/dev/zero of=/EMPTY  bs=1M 

sudo rm -f /EMPTY

3、物理主机: 执行 “VBoxManage modifyhd /the-path-of-VDI.vdi –compact”

vm虚拟机格式

如果你的虚拟硬盘是Vmware的VMDK格式,那就要麻烦点,因为VirtualBox不支持直接压缩VMDK格式,但是可以变通下:先转换成VDI并压缩,再转回VMDK。执行命令:

VBoxManage clonehd "source.vmdk" "cloned.vdi" --format vdi
VBoxManage modifyhd cloned.vdi --compact
VBoxManage clonehd "cloned.vdi" "compressed.vmdk" --format vmdk

事实上,执行命令的过程中可以发现:在从VMDK转换到VDI的过程中似乎已经做了压缩,文件大小已经减少了很多,第二条命令反而没见到文件大小有什么变化,所以这里第二条命令应该可以省略了。

VMDK 的压缩,也可以使用 vmware-vdiskmanager,只需要一条命令(参考):

vmware-vdiskmanager -k disk.vmdk

总结

同样是虚拟机软件,vmware和vbox都是十分好用的(当然国内大多vmware都是盗版咯)。在大部分情况下,vmware和vbox的体验无差异,甚至于vbox开源免费,体积小巧,用起来更为合适。但是在一些细节上,比如磁盘压缩功能,vbox就不想VMware一样有界面工具支持,这也和大部分开源软件一样,界面是比较简陋的,但是功能不少,各种命令行各种参数用起来一般也能达到目的。

实现zabbix对tomcat的监控

what-zabbix

优点:

  • 开源,无软件成本投入
  • Server 对设备性能要求低
  • 支持设备多,自带多种监控模板
  • 支持分布式集中管理,有自动发现功能,可以实现自动化监控
  • 开放式接口,扩展性强,插件编写容易
  • 当监控的 item 比较多服务器队列比较大时可以采用被动状态,被监控客户端主动从server 端去下载需要监控的 item 然后取数据上传到 server 端。这种方式对服务器的负载比较小。
  • Api 的支持,方便与其他系统结合

缺点:

  • 需在被监控主机上安装 agent,所有数据都存在数据库里,产生的数据很大,瓶颈主要在数据库。

how-zabbix

Zabbix 通过 C/S 模式采集数据,通过 B/S 模式在 web 端展示和配置。
被监控端:主机通过安装 agent 方式采集数据,网络设备通过 SNMP 方式采集数据
Server 端:通过收集 SNMP 和 agent 发送的数据,写入数据库(MySQL,ORACLE 等),
再通过 php+apache 在 web 前端展示

未分类

how-to-zabbix-Tomcat

首先我们需要了解一下zabbix和Tomcat的对应关系

  • zabbix_server开启java poller
  • zabbx_java开启JavaGateway,端口为10052
  • Tomcat JMX开启2222提供性能数据。

数据获取:java pollerJavaGateway:10052Tomcat:2222.

配置过程

server1(server):

首先先把zabbix搭建起来.

yum install zabbix-server-2.4.5-1.el6.x86_64.rpm zabbix-server-mysql-2.4.5-1.el6.x86_64.rpm zabbix-web-2.4.5-1.el6.noarch.rpm zabbix-web-mysql-2.4.5-1.el6.noarch.rpm zabbix-2.4.5-1.el6.x86_64.rpm php-bcmath-5.3.3-26.el6.x86_64.rpm php-mbstring-5.3.3-26.el6.x86_64.rpm  iksemel-1.4-2.el6.x86_64.rpm fping-2.4b2-16.el6.x86_64.rpm -y

在装zabbix之前确保服务器已经搭建lamp环境…..

安装zabbix后会自动在/etc/httpd/conf.d 中出现zabbix的配置文件

[root@server1 conf.d]# ls
php.conf  README  welcome.conf  zabbix.conf

创建存储zabbix的数据库,用户

mysql> create database zabbix character set utf8 collate utf8_bin;
mysql> create  user  zabbix@localhost identified by "miao";
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on zabbix.* to zabbix@localhost;
Query OK, 0 rows affected (0.00 sec)

或者这样创建用户

[root@server1 zabbix]# pwd
/etc/zabbix
[root@server1 zabbix]# vim .my.cnf

[mysql]
host = localhost
user = zabbix
password = miao
socket = /var/lib/mysql/mysql.sock
[mysqladmin]
host = localhost
user = zabbix
password = miao
socket = /var/lib/mysql/mysql.sock

往zabbix数据库导入数据(注意schema必须先导入)

[root@server1 ~]# cd /usr/share/doc/zabbix-server-mysql-2.4.5/create/
[root@server1 create]# mysql zabbix <schema.sql
[root@server1 create]# mysql zabbix <images.sql
[root@server1 create]# mysql zabbix <data.sql

配置服务端文件

vim /etc/zabbix/zabbix_server.conf

 72  DBHost=localhost
 82  DBName=zabbix
 98  DBUser=zabbix
106  DBPassword=miao

配置服务端agent文件(因为我用的是rpm包,所以必须配置)

vim /etc/zabbix/zabbix_agentd.conf

Hostname=server1.lalala.com
ServerActive=127.0.0.1
Server=127.0.0.1

设置php时区,两台主机必须一致,否则出错

vim /etc/php.ini

date.timezone = Asia/Shanghai

启动zabbix

未分类

自动注册设备时,需要的配置

未分类

zabix配置完毕,下面是监控tomcat的配置

vim /etc/zabbix/zabbix_server.conf 激活zabbix的JavaGateway模块

589 JavaGateway=127.0.0.1
590 JavaGatewayPort=10052    
591 StartJavaPollers=5

vim zabbix_java_gateway.conf

589 JavaGateway=127.0.0.1
590 JavaGatewayPort=10052
591 StartJavaPollers=5
[root@server1 zabbix]# /etc/init.d/zabbix-agent restart
[root@server1 zabbix]# /etc/init.d/zabbix-server restart
[root@server1 zabbix]#/etc/init.d/zabbix-java-gateway start

可以看到zabbix-java-gateway正常启动(10052)

未分类

server2(client):

yum install zabbix-agent-2.4.5-1.el6.x86_64.rpm zabbix-2.4.5-1.el6.x86_64.rpm -y

vim /etc/zabbix/zabbix_agentd.conf

 85 Server=172.25.88.1
126 ServerActive=172.25.88.1
135  Hostname=server2.lalala.com

zabbix-agent配置完毕,下面是监控tomcat的配置

yum install java-1.6.0-openjdk.x86_64 -y tar zxf apache-tomcat-7.0.37.tar.gz

vim /root/apache-tomcat-7.0.37/bin/catalina.sh

CATALINA_OPTS="-Dcom.sun.management.jmxremote
  -Dcom.sun.management.jmxremote.port=2222
  -Dcom.sun.management.jmxremote.ssl=false
  -Dcom.sun.management.jmxremote.authenticate=false"

设置server2 基于JVM(tomcat)的IP和端口

未分类

别忘了添加JMX的模板!

未分类

开启tomcat,并查看日志,tomcat正常启动…..

未分类

查看端口2222,java poller也正常启动

未分类

最后发现JVM的小绿灯也亮起来啦,而且有图像,成功!!!!

未分类

未分类

Tomcat 401 Unauthorized解决方法

今天首次在Mac上配置Tomcat,遇到了一个小坑,在此总结一下。

当开启Tomcat服务器,在浏览器输入 localhost:8080 ,表示你的Tomcat已经安装成功。如下图所示:

未分类

但是当你点击 Server Status、 Manager App 、Host Manager 就会出现如下的信息:

未分类

未分类

因此我们可以根据其提示信息来配置 tomcat-users.xml :

<role rolename="manager-gui"/>
<role rolename="admin-gui"/>
<user username="tomcat" password="123456" roles="manager-gui,admin-gui"/>

之所以没有添加 manager-script、manager-jmx,查看其文档就可知:

未分类

当然我们可以根据不同的需求来修改所赋予用户的角色。

最后还有一个很智障的地方就是我 没有把配置信息写在这对标签中间。

jdk 8.0报ignoring option PermSize MaxPermSize解决方法

项目目前使用的是jdk 8.0 Tomcat 版本是7.0.67

Jdk 版本

未分类

Tomcat 版本

未分类

在停止Tomcat 的时候可能出现如下报错

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0

使用JDK 8.0,把去掉PermSize和MaxPermSize两个参数设置去掉就可以了

未分类

使用下面的配置就不会报错了。

JAVA_OPTS=”$JAVA_OPTS -server -Xms1024m -Xmx1024m”

tcpdump学习与实践

在分析非HTTP协议网络时,在服务端一般使用tcpdump,客户端是wireshark(有一本书《wireshark网络分析就是这么简单》),利用空闲时间学习一下如何使用。

为了结合实践,这里用了swoole_server的一个简单的echo服务器。

<?php
$serv = new swoole_server("0.0.0.0", 9501);

$port = $serv->listen('127.0.0.1', 9501, SWOOLE_SOCK_UDP);
$port->on('packet', function($serv, $data, $addr){
    var_dump($serv, $data, $addr);
});

$serv->on('connect', function ($serv, $fd, $from_id){
   echo "[#".posix_getpid()."]tClient@[$fd:$from_id]: Connect.n";
});

$serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) {
   echo "[#".$serv->worker_id."]tClient[$fd]: $datan";
    if ($serv->send($fd, "hellon") == false)
    {
        echo "errorn";
    }
});

$serv->on('close', function ($serv, $fd, $from_id) {
   echo "[#".posix_getpid()."]tClient@[$fd:$from_id]: Close.n";
});

$serv->start();

客户端使用telnet

$ telnet 127.0.0.1 9501

实验开始

(由于在命令行下操作,所以需要启动多个窗口)

窗口1:

$ php echo.php # 开启服务

窗口2:

$ sudo tcpdump -i any tcp port 9501 # 开启tcpdump

窗口3:

$ telnet 127.0.0.1 9501 # 客户端连接

观察窗口2:

首先,tcpdump需要在root用户下运行,
-i 参数制定了网卡,any表示所有网卡,监听tcp协议,端口为9501
可以发现,倒数三行是一个完整的TCP三次握手,
客户端发送SYN[S]
服务端回答SYN,ACK[S.]
客户端发送ACK[.]

列参数含义

  • 11:24:18.062098 时间带有精确到微妙
  • localhost.8816 > localhost.9501 表示通信的流向,8816是客户端,9501是服务器端
  • [S] 表示这是一个SYN请求
  • [.] 表示这是一个ACK确认包,(client)SYN->(server)SYN->(client)ACK 就是3次握手过程
  • [P] 表示这个是一个数据推送,可以是从服务器端向客户端推送,也可以从客户端向服务器端推
  • [F] 表示这是一个FIN包,是关闭连接操作,client/server都有可能发起
  • [R] 表示这是一个RST包,与F包作用相同,但RST表示连接关闭时,仍然有数据未被处理。可以理解为是强制切断连接
  • win 342是指滑动窗口大小
  • length 12指数据包的大小

发送数据

客户端 》服务端

未分类

服务端 》客户端

未分类

关闭连接(客户端主动关闭,四次挥手)

未分类

关闭连接(服务端退出,三次挥手)

未分类

tcpdump抓包实战分享

网络抓包,是运维工程师很一项重要,也需要的技能。但实现生活中却少有运维工程师能掌握。因为一来学习比较难,二来工作中用得少,一段时间没用就忘光光了~~

但是这个技能可以大大减少运维人员背锅的机率。有好几次,开发都说我:我的代码没问题,是请求没有进来; 或是说网络有问题;或者说是你负载均衡转发时把参数搞丢了;等*4。最后都被我用抓包技能成功反杀。也就是说在实际工作中遇到某些问题,它是可以做为解决问题的一种手段!
我相信,应该有些朋友在遇到问题时,也想过要抓包,但是却不知道从哪里入手好,希望听过这个分享后,能帮你形成一个思路。

至于抓包的工具,在windows平台下,一般我用wireshark,这个工具很叼的,抓了包后还能帮你把数据包整理得一清二楚,GUI界面的用起来也比较方便。而linux下的一般用的是tcpdump,这个工具也是非常叼的,不过它是个命令行工具,用起来可不是一般地难,但是做为运维工程师,面对最多的系统就是linux了。所以今天的分享,不难的就算了,要讲就讲点有难度的。所以这次分享用的就是tcpdump。又因为是实战性的分享,所以就没有那么多的文字材料可以给大家,不过分享之后,我回头会做个总结性的东西放共享里,方便大家记忆。目前群空间里有两个本次分享要用到的图片,可以先下载一来。一边听一边看最好了。

然后我会以http流量为示例进行抓包讲解,因为在实际工作环境下,需要用到抓包分析的,十有八九是http流量。了解所以然后,其实其他类型的流量均是换汤不换药的。

OK。用tcpdump抓包,有两个东西要先学。一个是工作参数(废话),另一个是BPF(全称Berkeley Packet Filter 伯克利封包过滤器,没错,就是著名的加州大学伯克利分校,创造的一种专门过滤网络数据包的过滤语言)

参数多的不讲,讲几个实用的。大家记住就好。

  • -X:很重要:以16进制和ASCII码显示包数据。现场分析数据包内容必备

  • -nnn:比较重要:让tcpdump不要把IP地址转化为网络名称,不要把端口显示为服务名

  • -s0:一般重要:抓包最好带上,-s指定数据包截断的长度,0表示不截断,tcpdump默认截断68字节

  • -i :一般重要 :指定要抓包的网络接口,eth0/eth1/wlan0/lo等等,BPF明明没写错,就是抓不到包,就要注意一下这里是不是写错了。还有,强调一点127.0.0.1是属于lo环回接口

  • -w:记得就好:保存到文件里,可以后期结合wireshark来分析。屏幕不会输出。

  • -c:记得就好:-c 10 抓满10个包就退出

(这时可以现场演示一下各个参数)

BPF:

讲BPF包过滤语言前,大家先了解一下网络五元组是什么。源IP地址,目的IP地址,源端口,目的端口,协议 这五个。网络请求的发起方(源),用一个随机端口去连接远端计算机一个具体的端口,远端计算机响应此请求时,会把源IP端口和目的IP端口反过来,把响应报文发回去。

有几点要先让大家记得的:

  • BPF支持加减乘除,包括移位运算
  • BPF支持and(&&) or(||) not(!)逻辑运算
  • BPF可以用括号等改变运算顺序
  • 使用时请用单引号包起来防止shell误读

OK。进入正式BPF内容:

请住以下三段中的单词或字母:

一,tcp(tcp协议) udp(udp协议) icmp(icmp协议,就是ping用的)
二,src(源source缩写) dst(目的destination缩写)
三,host(主机IP/网络名) port(端口) portrange(端口范围) net(网段)

这三段可以自由组合,但是要注意,
一是协议类型放在第一位置。二是icmp协议没有端口一说。
比如tcp src host 192.168.0.1 ,表示源IP地址为192.168.0.1的TCP数据包
udp dst port 53,表示发到远端服务器53端口(目的端口为53)的udp数据包
icmp src 192.168.1.0/24,表示来自(源地址)为192.168.1.0网段(192.168.1.0~192.168.1.255)的ICMP数据包

加上逻辑判断的:

  • tcp dst port 80 and dst host 192.168.0.100 目的IP为192.168.0.100,目的端口为80的TCP数据包
  • dst host 192.168.0.100 and ! udp port 53 目的IP为192.168.0.100,但不是udp53端口的所有数据包

OK。到这里,其实就可以满足大部分工作需求了。
今天就讲到这里的话,那也太LOW了~~~

接下来是BPF的高级部分,一定要认真听了。

因为IP包头的东西比较简单,上面讲的东西会用了,也没IP包头什么事了。难点重点在于TCP报文,因为TCP报文是带了数据的,TCP头之后就是数据的开始。要玩高端的抓包,就是要针对TCP头或是数据内容进行抓包,比如只抓握手包,只抓POST提交的包,比如只抓某个URL的包,特别后面两个,直接从四层捕获七层的内容,很爽吧!所以大家一定要打开TCP数据包分解图,一边听我讲,一边看。

有些群友是不是一看这个图头都大了?

不过我们不是网工,我们不用去记那么多东西的。让我们来过滤过滤
首先橙色和浅蓝色的两段number不用看它,蓝色的window size,绿色的tcp checksum跟它旁边的紫色不用看它。现在剩下三段半的东西而已。

现在大家看到的都是是计算机基础知识。图中的一段长度是32bit,就是32比特,比特是计算机最小的基础单位了。每个比特就只能表示0或者1,8个比特表示一字节。就是图中黑格白格的那些,每格表示一个字节。一段就是4个字节。一个字符占用一个字节,所以每一段32比特的长度只能表示4个字符。

先看第一段的源端口和目的端口,各占16个比特的长度,16比特范围能表示多大呢,也就是二进制的0000000000000000到1111111111111111,打开你们电脑的科学计算器,二进制16个1转为10进制是多少?65535啊亲,这就是为什么系统的端口最大只能是65535的原因。

红白黄一会再聊,看白色的option,这个是可变长的选项字段,长度从0到40字节,且必须是4字节的整倍数,直白点就是要加就是一段一段加。
最后我们第七层应用层的数据就跟在option后面以ascii码的形式出现了。所以要找到数据位置,就得先确定tcp头部长度,但是option长度是可变的,那要怎么得知位置呢?

这里就要靠上面的红格子啦。我先直接给你们bpf,再解释为什么。

tcp[12] >> 2

在tcpdump里。tcp[12]表示tcp报文中的第12个字节,看图,第12字节就是红白格子。事实上,有用的只有红色格子,它只占4比特,半个字节。白色格子是预留的空位,不起作用的,恒定为0.

看回tcp[12] >> 2,这里是将12字节的值做右移位处理,这里其实是做了数字上的简化,原操作应该是这样的
( tcp[12] >> 4 ) << 2,先做4位右移,再做2位左移,用乘除的方式表达就是( tcp[12] / 16 ) × 4
为什么要这么计算,因为红格子里面记录的是TCP报名头的长度,是一个偏移量,单位为4字节(1段),所以我们用长度×4,就能计数出整个个TCP头的字节了。那么除以16又是什么鬼?我们来看一下数据包例子。包的tcp[12]是整个字节,例子中是80(注意:这是十六进制)。刚才说了,有用的红色格子只占了半个字节,也就是只有前面的8是要用到的,0是无用的。
在10进制里,要把一个整数最后的0去掉,是做除法,除以10,在十六进制里也是做除法,不过是除以16。

所以简化一下就是tcp[12] / 4,正好是右移2位(也是因为计算机做移位操作比除法快,所以换成移位操作)

确定TCP头长度后,后面的就是数据了。那我们现在就开始针对数据内容来抓包。

我们先来抓POST请求的包。

让我们先来看一下HTTP协议是怎么做HTTP请求的。
http请求由三部分组成,分别是:请求行、消息报头、请求正文

POST /index.html HTTP/1.1
Host: www.xxx.com
Content-Length:22
Connection:Keep-Alive
Cache-Control:no-cache

user=jeffrey&pwd=1234

POST这几个字符正好是出现在数据最前面的四个字节。

在tcpdump里tcp[x:n]表示tcp报文,偏移x个字节后,长度为n字节的数据。
所以我们用tcp[(tcp[12] >> 2):4]表示数据开始的前4个字节。注意:数据内容是用16进制ascii码来表示的。

POST的十六进制ascii为0x504f534(python中用ord(‘P’)获取P的十进制ascii码,用hex(ord(‘P’))获取P的十六进制ascii码)

所以我们的BPF可以这样写:

tcp[(tcp[12] >> 2):4] = 0x504f5354

注意,这里的:4不是随便填的。tcpdump只支持1,2,4这三种长度

之后可以再举例抓路径名的,介绍+的使用

最后看喜好介绍TCP标志位的抓包方法
外国友人记忆标记位的方法:

Unskilled Attackers Pester Real Security Folks

蹩脚的攻击者缠住了真正的安全人员
(不知道是不是可以翻译成:盲拳打死老师傅)

Unskilled = URG
Attackers = ACK
Pester = PSH
Real = RST
Security = SYN
Folks = FIN

19:53:32.320702 IP 10.0.0.91.49808 > 202.104.101.103.http: Flags [P.], seq 0:582, ack 1, win 115, options [nop,nop,TS val 3307698431 ecr 10667605], length 582
0x0000: 4500 027a a33d 4000 4006 5b16 0a00 005b E..z.=@.@.[….[
0x0010: ca68 6567 c290 0050 cc09 dbc4 da97 f8e2 .heg…P……..
0x0020: 8018 0073 6aad 0000 0101 080a c527 78ff …sj……..’x.
0x0030: 00a2 c655 504f 5354 202f 696e 6465 782e …UPOST./index.
0x0040: 7068 703f 633d 7363 6826 613d 6765 7453 php?c=sch&a=getS
0x0050: 6368 6564 756c 6520 4854 5450 2f31 2e31 chedule.HTTP/1.1
0x0060: 0d0a 582d 5265 616c 2d69 703a 2032 3131 ..X-Real-ip:.211
0x0070: 2e31 3534 2e31 3536 2e33 380d 0a58 2d46 .154.156.38..X-F
0x0080: 6f72 7761 7264 6564 2d46 6f72 3a20 3231 orwarded-For:.21
0x0090: 312e 3135 342e 3135 362e 3338 0d0a 4854 1.154.156.38..HT
0x00a0: 5450 5f43 4c49 454e 545f 4950 3a20 3231 TP_CLIENT_IP:.21
0x00b0: 312e 3135 342e 3135 362e 3338 0d0a 4854 1.154.156.38..HT
0x00c0: 5450 5f58 5f46 4f52 5741 5244 4544 5f46 TP_X_FORWARDED_F
0x00d0: 4f52 3a20 3231 312e 3135 342e 3135 362e OR:.211.154.156.
0x00e0: 3338 0d0a 5245 4d4f 5445 5f41 4444 523a 38..REMOTE_ADDR:
0x00f0: 2032 3131 2e31 3534 2e31 3536 2e33 380d .211.154.156.38.
0x0100: 0a57 4c2d 5072 6f78 792d 436c 6965 6e74 .WL-Proxy-Client
0x0110: 2d49 503a 2032 3131 2e31 3534 2e31 3536 -IP:.211.154.156
0x0120: 2e33 380d 0a50 726f 7879 2d43 6c69 656e .38..Proxy-Clien
0x0130: 742d 4950 3a20 3231 312e 3135 342e 3135 t-IP:.211.154.15
0x0140: 362e 3338 0d0a 436f 6e74 656e 742d 4c65 6.38..Content-Le
0x0150: 6e67 7468 3a20 3933 0d0a 436f 6e74 656e ngth:.93..Conten
0x0160: 742d 5479 7065 3a20 6170 706c 6963 6174 t-Type:.applicat
0x0170: 696f 6e2f 782d 7777 772d 666f 726d 2d75 ion/x-www-form-u
0x0180: 726c 656e 636f 6465 643b 2063 6861 7273 rlencoded;.chars
0x0190: 6574 3d55 5446 2d38 0d0a 486f 7374 3a20 et=UTF-8..Host:.
0x01a0: 7773 6170 692e 3931 3136 302e 636f 6d0d wsapi.91160.com.
0x01b0: 0a43 6f6e 6e65 6374 696f 6e3a 204b 6565 .Connection:.Kee
0x01c0: 702d 416c 6976 650d 0a55 7365 722d 4167 p-Alive..User-Ag
0x01d0: 656e 743a 2041 7061 6368 652d 4874 7470 ent:.Apache-Http
0x01e0: 436c 6965 6e74 2f34 2e35 2028 4a61 7661 Client/4.5.(Java
0x01f0: 2f31 2e37 2e30 5f37 3929 0d0a 4163 6365 /1.7.0_79)..Acce
0x0200: 7074 2d45 6e63 6f64 696e 673a 2067 7a69 pt-Encoding:.gzi
0x0210: 702c 6465 666c 6174 650d 0a0d 0a75 6964 p,deflate….uid
0x0220: 3d33 2664 6f63 6964 3d32 3336 3726 656e =3&docid=2367&en
0x0230: 645f 6461 7465 3d32 3031 362d 3037 2d31 d_date=2016-07-1
0x0240: 3326 746f 6b65 6e3d 686a 2a71 6b2d 3538 3&token=hj*qk-58
0x0250: 3536 3326 6265 6769 6e5f 6461 7465 3d32 563&begin_date=2
0x0260: 3031 362d 3036 2d32 3926 6465 7069 643d 016-06-29&depid=
0x0270: 3436 3126 6369 643d 3237 461&cid=27

印象笔记,让记忆永存。下载印象笔记

利用SSH上传、下载(使用sz与rz命令)

简述

通常,利用SSH管理远程Linux服务器时,经常需要与本地交互文件。当然,我们可以利用FTP方式,比如通过Filezilla客户端软件。不过直接使用SSH软件(SecureCRT、Xshell)自带的上传和下载功能无疑使最方便快捷的。通常SSH软件支持的文件传输协议主要有ASCII、Xmodem、Zmodem等。

rz,sz是便是linux/Unix同Windows进行ZModem文件传输的命令行工具。

1、使用前提

  • 首先,你的Linux端(CentOS, Ubuntu)需要安装rz/sz命令,也就是 lszrz 包。
  • 其次,windows端需要支持ZModem的telnet/ssh客户端(Xshell,SecureCRT支持,好像putty不支持),SecureCRT就可以用SecureCRT登陆到Unix/Linux主机(telnet或ssh均可)
  • 运行命令rz,即是接收文件,xshell就会弹出文件选择对话框,选好文件之后关闭对话框,文件就会上传到linux里的当前目录。如果要上传文件,直接用鼠标点住文件往X-shell里面一拖即是
  • 运行命令 sz file 就是发文件到windows上(保存的目录是可以配置) 比ftp命令方便多了,而且服务器不用再开FTP服务了

2、文件传输协议

文件传输是数据交换的主要形式。在进行文件传输时,为使文件能被正确识别和传送,我们需要在两台计算机之间建立统一的传输协议。这个协议包括了文件的识别、传送的起止时间、错误的判断与纠正等内容。常见的传输协议有以下几种:

  • ASCII:这是最快的传输协议,但只能传送文本文件。
  • Xmodem:这种古老的传输协议速度较慢,但由于使用了CRC错误侦测方法,传输的准确率可高达99.6%。
  • Ymodem:这是Xmodem的改良版,使用了1024位区段传送,速度比Xmodem要快
  • Zmodem:Zmodem采用了串流式(streaming)传输方式,传输速度较快,而且还具有自动改变区段大小和断点续传、快速错误侦测等功能。这是目前最流行的文件传输协议。

3、在Linux上安装lrzsz

单单是SSH客户端软件支持以上文件传输协议(ASCII,Xmodem,Ymodem,Zmodem)还不行,我们的Linux服务器上也得安装相应的软件,以支持这些文件传输协议才行。在Linux上,lrzsz就是完成此任务的,lrzsz就是一个支持Zmodem 传输协议的工具。我们通过sz/rz两个命令,分别发送/接收文件。如果我们的系统中没有安装lrzsz这个包,就会报错,安装即可解决。

[root@localhost ~]# rz
-bash: rz: command not found
## For CentOS/RHEL
[root@localhost ~]# yum -y install lrzsz
## For Ubuntu
# sudo apt-get install lrzsz

4、理解记忆

其中,对于sz和rz的理解与记忆我用了如下的方法(很多时候容易搞混):

  • sz中的s意为send(发送),告诉客户端,我(服务器)要发送文件 send to cilent,就等同于客户端在下载。
  • rz中的r意为received(接收),告诉客户端,我(服务器)要接收文件 received by cilent,就等同于客户端在上传。

记住一点,不论是send还是received,动作都是在服务器上发起的。我们习惯了说上传或是下载,其实大可不必。使用这两个命令,只要思考一点,是要把文件从服务器上发送出去,还是从客户端接收回来,就可以了。

好吧,最后总结为一句话:

我(客户端)上传,你(服务器)接收(RZ),我下载(客户端),你(服务器)发送(SZ)。

5、简单用法

  • sz用法:发送出去
### 下载一个文件: 
# sz filename 
### 下载多个文件: 
# sz filename1 filename2
### 下载dir目录下的所有文件,不包含dir下的文件夹: 
# sz dir/*
  • rz用法:接收回来
### 直接键入rz命令即可
# rz
### 直接拖动文件到 xshell, 或者 SecureCRT 窗口即可
输入rz回车后,会出现文件选择对话框,选择需要上传文件,一次可以指定多个文件,上传到服务器的路径为当前执行rz命令的目录。

6、设置默认路径

SecureCRT:

设置上传和下载的默认目录:

  • 英文版: options — session options — X/Y/Zmodem。

  • 中文版: 选项— 会话选项— X/Y/Zmodem。

未分类

未分类

Xshell:

设置上传和下载的默认目录:

File -> Properties -> ZMODEM

未分类

未分类

7、操作演示

(仅演示Xshell,其他类似)

rz命令(下载)

当我们键入rz命令之后,会弹出文件选择对话框,选择需要传输的文件,点击 Add 即可。

接收的目录就是我们当前执行rz命令的目录。

未分类

今天又发现一个更简单直接的方法,直接选中文件,用鼠标点住文件往Xshell里面一拖就可以了。

sz命令(上传)

假设我要发送文件,直接使用sz命令, 其后接上文件名即可。同理,敲下回车后,也会弹出对话框,让我们选择接收的文件夹。

[root@localhost ~]# sz nagios-4.0.7.tar.gz  nagios-plugins-2.0.3.tar.gz

8、问题

xshell或者SecureCRT 启动 tmux或screen之后,sz, rz 命令都无法弹出正常的文件选择窗口,该如何解决?

看起来 tmux 下不支持 zmodem,所以这两个命令也用不了。

使用sed或awk获取除最后两个字段之外的字段

字符串示例为:

/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/ufs-client-2.0.0.jar

需求:如果使用斜杠/作为分隔符的话,可能每个字符串的字段数不同,这时需要取 除了最后两个字段外的其他字段字符串,所得结果应为如下形式:

/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/

解决方法:

1、使用sed

[root@www ~]# b="/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/2.0.0/ufs-client-2.0.0.jar"
[root@www ~]# a=`echo "/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/2.0.0/ufs-client-2.0.0.jar" |awk -F'/' '{print $(NF-1)"/"$NF}'`
[root@www ~]# echo $b|sed -n "s#$a##gp"
/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/

2、使用awk

[root@www ~]# b="/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/2.0.0/ufs-client-2.0.0.jar"
[root@www ~]# echo $b |awk -F'/' '{gsub($(NF-1)"/"$NF,"");print}'
/Users/yfan/Downloads/dsc20170801_jar/releases/com/netfinworks/ufs/ufs-client/

同一机器配置多个git密钥连接多个仓库

问题阐述

当有多个git账号的时候,比如一个github,用于自己进行一些开发活动,再来一个gitlab,一般是公司内部的git。这两者你的邮箱如果不同的话,就会涉及到一个问题,生成第二个git的key的时候会覆盖第一个的key,导致必然有一个用不了。

问题解决

我们可以在~/.ssh目录下新建一个config文件配置一下,就可以解决问题

具体步骤

  • 生成第一个ssh key(这里我用于github,用的gmail邮箱)
ssh-keygen -t rsa -C "[email protected]"

这里不要一路回传,让你选择在哪里选择存放key的时候写个名字,比如 id_rsa_github,之后的两个可以回车。

完成之后我们可以看到~/.ssh目录下多了两个文件

未分类

  • 生成第二个ssh key(这里我用于gitlab,用的是公司邮箱)
ssh-keygen -t rsa -C "[email protected]"

还是一样不要一路回车,在第一个对话的时候继续写个名字,比如 id_rsa_gitlab,之后的两个可以回车。

完成之后我们可以看到如2中图所标记,一样出现两个文件。(一个公钥一个私钥)

  • 打开ssh-agent

这里如果你用的github官方的bash,ssh-agent -s,如果是其他的,比如
msysgit,eval $(ssh-agent -s)

  • 添加私钥
ssh-add ~/.ssh/id_rsa_github
ssh-add ~/.ssh/id_rsa_gitlab
  • 创建并修改config文件

在windows下新建一个txt文本,然后将名字后缀一起改成config即可
在bash下的话直接touch config 即可。
添加一下内容

# gitlab
Host git.iboxpay.com
    HostName git.iboxpay.com  //这里填你们公司的git网址即可
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_gitlab
    User zhangjun

# github
Host github.com
    HostName github.com
    PreferredAuthentications publickey
    IdentityFile ~/.ssh/id_rsa_github
    User ZJsnowman
  • 在github和gitlab上添加公钥即可,这里不再多说。

  • 测试

未分类

PS:如果到这里你没有成功的话,别急,教你解决问题的终极办法–debug

比如测试github,ssh -vT [email protected]

-v 是输出编译信息,然后根据编译信息自己去解决问题吧。就我自己来说一般是config里的host那块写错了。

补充一下

如果之前有设置全局用户名和邮箱的话,需要unset一下

git config --global --unset user.name
git config --global --unset user.email

然后在不同的仓库下设置局部的用户名和邮箱

比如在公司的repository下git config user.name “yourname” git config user.email “youremail” 在自己的github的仓库在执行刚刚的命令一遍即可。

这样就可以在不同的仓库,已不同的账号登录。