首先需要StrongSwan在报文交互中记录下来IKE和ESP的秘钥信息,参见如下的save-keys.opt文件,负责这一功能的插件为save-keys。其由4个配置参数,load参数表明是否加载此插件;esp参数表明是否记录保持ESP秘钥;ike参数表明是否记录IKE秘钥;最后最关键的是参数wireshark_keys,其值为目录字符串,表示秘钥存储的位置,IKEv1协议的秘钥存储在指定目录的文件:kev1_decryption_table中,而IKEv2协议的秘钥存储在文件ikev2_decryption_table中,ESP子安全关联的秘钥存储在文件:esp_sa中。

$ cat strongswan-5.8.1/conf/plugins/save-keys.opt
charon.plugins.save-keys.load := noWhether to load the plugin.charon.plugins.save-keys.esp = noWhether to save ESP keys.charon.plugins.save-keys.ike = noWhether to save IKE keys.charon.plugins.save-keys.wireshark_keysDirectory where the keys are stored in the format supported by WiresharkDirectory where the keys are stored in the format supported by Wireshark.IKEv1 keys are stored in the _ikev1_decryption_table_ file.IKEv2 keys are stored in the _ikev2_decryption_table_ file.Keys for ESP CHILD_SAs are stored in the _esp_sa_ file.

如下文件:strongswan-5.8.1/src/libcharon/plugins/save_keys/save_keys_listener.c 中的代码所示,在打开秘钥文件时fopen使用的模式为“a”,所以每次记录保存秘钥时都是向文件中追加。

METHOD(listener_t, ike_derived_keys, bool,private_save_keys_listener_t *this, ike_sa_t *ike_sa, chunk_t sk_ei,chunk_t sk_er, chunk_t sk_ai, chunk_t sk_ar)
{version = ike_sa->get_version(ike_sa);name = version == IKEV2 ? ikev2_name : ikev1_name;if (asprintf(&path, "%s/%s", this->path, name) < 0) return TRUE;file = fopen(path, "a");if (file) {id = ike_sa->get_id(ike_sa);if (version == IKEV2){ike_names(ike_sa->get_proposal(ike_sa), &enc, &integ);if (enc && integ) {fprintf(file, "%.16"PRIx64",%.16"PRIx64",%+B,%+B,\"%s\",""%+B,%+B,\"%s\"\n", be64toh(id->get_initiator_spi(id)),be64toh(id->get_responder_spi(id)), &sk_ei, &sk_er,enc, &sk_ai, &sk_ar, integ);

如下在StrongSwan的测试用例ikev2/acert-fallback中加载save-keys插件,在测试所用的网关moon的strongswan.conf文件中做如下修改。在load一行的最后添加save-keys插件,并且在随后的plugins段中增加如下的save-keys的四个参数配置,秘钥保存目录设置为:/home/example/keys。

# vi strongswan-5.8.1/testing/tests/ikev2/acert-fallback/hosts/moon/etc/strongswan.conf
#
# /etc/strongswan.conf - strongSwan configuration filecharon {load = random nonce aes sha1 sha2 pem pkcs1 curve25519 gmp x509 ...(省略) updown save-keysplugins {save-keys {esp = yesike = yesload = yeswireshark_keys = /home/example/keys}}}

运行测试用例ikev2/acert-fallback:

$ cd strongswan-5.8.1/testing/
$
$ sudo ./do-tests ikev2/acert-fallback

结束之后,可在moon主机的目录/home/example/keys/下看的生成的秘钥文件:esp_sa 和ikev2_decryption_table。

$ ssh root@10.1.0.1
$
moon:~# cat /home/example/keys/esp_sa
"IPv4","192.168.0.100","192.168.0.1","0xc4e70f8b","AES-CBC [RFC3602]","0x63b7d831b9d2b6d5820086ccf11792dc","HMAC-SHA-256-128 [RFC4868]","0x4e334f0d29a188390f6d5100925fee35fee6c49e86e9c24d01b9c56d250cc63c"
"IPv4","192.168.0.1","192.168.0.100","0xc2e6d4cf","AES-CBC [RFC3602]","0xc4dac45d5a5417325bd5e59dd14df359","HMAC-SHA-256-128 [RFC4868]","0xda364ff9349add2d53323575146aabdd713f184f3b0b6d5714af099801d2af1e"
moon:~#
moon:~# cat /home/kai/example/keys/ikev2_decryption_table
aff259722a847b61,91bcf37f0f42d1e1,0f3dec6591429dac32c8b3d198368ae1,f189c132acddf32445e47d848ec1c720,"AES-CBC-128 [RFC3602]",54a82b10c9f27bf4754383e773903794ce0517cafeab576853fd7f13dac0c0d7,75365c2540f08c7b4ec74735670ca3e8c90b8a68136311a2b5763705962daf3b,"HMAC_SHA2_256_128 [RFC4868]"

要解密测试过程中的IKE和ESP交互报文,只需要将这两个文件拷贝到Wireshark所在主机的目录(假设wireshark信息在windows主机上):C:\Users\zhangkai\AppData\Roaming\Wireshark\下,随后使用wireshark打开测试过程中使用tcpdump抓取的报文即可。

另外,对于ESP SA的解密,还需要在wireshark软件中,edit->preferences->protocols->ESP界面,勾选选项:Attemp to detect/decode encrypted ESP payloads。默认情况下没有打开此选项。

除了以上拷贝秘钥文件的方法外,还可以将save-keys插件生成的秘钥文件内容逐一输入到wireshark中。如上图所示,点击ESP SAs右侧的编辑/Edit按钮,打开如下的秘钥输入界面,进行手动输入。注意界面右下方的保存目录文件,如果之前没有设置过ESP秘钥,此处不会显示目录文件。

对于IKE秘钥的输入,位于界面edit->preferences->protocols->ISAKMP,

最后,save-keys插件并不能够记录所有加密和校验算法的秘钥,如camellia加密算法秘钥就不能记录,还有一些save-keys支持的算法而Wireshark不支持,或者相反。支持的加密和校验算法可参考源码文件:strongswan-5.8.1/src/libcharon/plugins/save_keys/save_keys_listener.c。如下列出了支持的ESP加密算法:

/* Wireshark ESP algorithm identifiers for encryption*/
static algo_map_t esp_encr[] = {{ ENCR_NULL,          -1, "NULL"                    },{ ENCR_3DES,          -1, "TripleDes-CBC [RFC2451]" },{ ENCR_AES_CBC,       -1, "AES-CBC [RFC3602]"       },{ ENCR_AES_CTR,       -1, "AES-CTR [RFC3686]"       },{ ENCR_DES,           -1, "DES-CBC [RFC2405]"       },{ ENCR_CAST,          -1, "CAST5-CBC [RFC2144]"     },{ ENCR_BLOWFISH,      -1, "BLOWFISH-CBC [RFC2451]"  },{ ENCR_TWOFISH_CBC,   -1, "TWOFISH-CBC"             },{ ENCR_AES_GCM_ICV8,  -1, "AES-GCM [RFC4106]"       },{ ENCR_AES_GCM_ICV12, -1, "AES-GCM [RFC4106]"       },{ ENCR_AES_GCM_ICV16, -1, "AES-GCM [RFC4106]"       },
};

END

Wireshark解密SWAN交互报文相关推荐

  1. wireshark 解密加密报文

    wireshark 解密IPSec加密后的报文 序言 wireshark作为一款非常优秀的抓包工具,支持了各种各样的网络协议,成为了网络开发中必不可少的工具之一.一般而言,对于普通的网络数据包,wir ...

  2. 从自签名证书到wireshark解密https

    一 背景 以前使用库写过一个https的特定算法的解密,整个测试过程比较麻烦,这边记录下测试准备内容. 二 生成自签名证书 HTTPS正常情况下使用的证书都是由CA结构颁发的,浏览器内置了根证书,这样 ...

  3. Tacacs-协议交互报文抓包示例

    其他文章: Tacacs+协议原理 Tacacs+服务搭建与配置详解 Tacacs+各厂商交换机配置 Tacacs+协议交互报文抓包示例 tacacs+协议报文抓包示例 如果使用wireshark对t ...

  4. 转载:使用Wireshark解密TLS 1.3流量

    使用Wireshark解密TLS 1.3流量 作者: 虞卫东 (微信公众号: https://mp.weixin.qq.com/s/QhodMl210xWMK9XKjVtfAQ ) 2018-05-1 ...

  5. 小实验:利用wireshark解密https

    写的不够全面,甚至会有错误,会慢慢补全相关内容,欢迎大家在评论区友好交流,批评指正. 小实验:利用wireshark解密https 一.实验过程 1.配置系统用户环境变量 2.配置Wireshark工 ...

  6. 使用WireShark简单分析ICMP报文

    ICMP协议介绍 1.ICMP是"Internet Control Message Protocol"(Internet控制消息协议)的缩写. 它是TCP/IP协议族的一个子协议. ...

  7. 使用wireshark解密PC浏览器的HTTPS流量

    使用wireshark进行抓包的过程中,我们常常会抓到TLS报文,会加密应用层(例如HTTP)的内容,我们所看到的数据都是加密之后的,无法分析应用层数据.在第一部分中我介绍了TLS(SSL)协议,可知 ...

  8. 使用wireshark分析tcp/ip报文之报文头

    以太网报文的结构如下: 其中,以太网的帧头: 14 Bytes:MAC目的地址48bit(6B),MAC源地址48bit(6B),Type域2B,一共14B. IP头部: TCP头部: http:// ...

  9. 基于wireshark lua 插件的报文按需切割方法

    本文简单说明一下基于wireshark的大报文的按需切割方法,主要说明的是如何将一个很大的报文按照需求变成一个较小的报文. 我们在面对百G的数量级报文的时候,可能只关注报文中的少数内容,这个时候就需要 ...

最新文章

  1. Matlab 如何回退上一步、批量注释以及取消注释
  2. springboot springcloud 热部署
  3. C#序列化反序列化对象为base64字符串
  4. 浏览器控件JxBrowser 6.18发布 | 极大增强了安全性
  5. 还在为Linux入门发愁?
  6. Linux,OS X mark工具(目录跳转工具)
  7. 蒙文字体怎么安装_焘哥带你玩转字体(三)字体的安装及显示问题
  8. 英国电信公司沃达丰遭到网络攻击
  9. hazelcast 使用_使用Hazelcast发布和订阅
  10. c语言之计算两个数的大数
  11. 2.1线性表的类型定义
  12. android init.rc 到底在哪里?
  13. 谁将掌控中国的金融?(上)
  14. macOS 升级12.0.1后,virtualBox 又不能用了
  15. 详细理解中缀表达式并实现
  16. ESP32使用PCF8563时钟模块进行网络校时
  17. linux终端保存gif,Linux下好用的GIF屏幕截图
  18. 谷歌AI平均每天发表2篇论文!Jeff Dean执笔年度汇总:16大方向
  19. 数据库为什么要分库分表
  20. Oracle数据库创建定时任务

热门文章

  1. 国鼎IGBT-TRW(E/G)5065NH1是50A,650V高可靠性IGBT,具有高速开关特性、及低导通损耗和开关损耗等特点
  2. 突发!阿里组织架构大调整
  3. Matlab图像处理实例讲解(杨丹、赵海滨
  4. 从“顶点小说”下载完整小说——python爬虫
  5. 可以播放音频的c语言程序,用C语言怎么实现播放音乐?
  6. 企业远程工作安全及简化
  7. 05月13日三支有望飙涨股与操盘策略分析
  8. 深度学习: 卷积核尺寸size为什么是 奇数
  9. 路径规划算法:基于樽海鞘算法的路径规划算法- 附代码
  10. 基于樽海鞘算法的极限学习机(ELM)回归预测-附代码