systemtap迷惑别人抓包,修改或者损坏数据包

一般遇到莫名其妙的网络问题时,第一反应就是抓包分析,然而抓取的数据包真的可信吗?

抓包会不会帮倒忙,让事情更加微妙从而火上浇油呢?我让你抓,抓个毛线啊!

完全正确,只要做一点手脚即可,这次我用systemtap。

我希望的效果是,只要你抓包,显示的都是127.0.0.1到本机的包,哈哈,无论怎样都是这种数据包,从而迷惑程序员的判断。

stap的脚本代码如下:

#! /usr/bin/stap -g

%{
#include <linux/if_ether.h>
#include <linux/ip.h>
#include <linux/if_packet.h>
%}

function reset_skb(skb:long, type:long)
%{
	struct sk_buff *skb2 = (struct sk_buff *)STAP_ARG_skb;
	struct ethhdr *eth;
	struct iphdr *hdr;

	eth = (struct ethhdr *)skb_mac_header(skb2);
	if (skb2->pkt_type == PACKET_OUTGOING)
		eth = (struct ethhdr *)(skb2->data);
	if (eth->h_proto != 8) return;
	hdr = (struct iphdr *)(((char *)eth) + sizeof(struct ethhdr));
	if (STAP_ARG_type == 0) {
		// rehat系列可用,否则就借用mark之类的IP层以下不用的字段(bridge除外)。
		skb2->rh_reserved1 = hdr->saddr;
		skb2->rh_reserved2 = hdr->daddr;
		hdr->saddr = 0x100007f;
		hdr->daddr = 0x100007f;
	} else {
		hdr->saddr = skb2->rh_reserved1;
		hdr->daddr = skb2->rh_reserved2;
	}
%}

probe kernel.function("tpacket_rcv")
{
	reset_skb($skb, 0);
}

// probe return是必须的,下面会讲
probe kernel.function("tpacket_rcv").return
{
	reset_skb($skb, 1);
}

来看看效果:
在这里插入图片描述
运行脚本和X掉脚本的对比如上图所示。

其实,我本来是可以用Rootkit的方式来完成这件事的,并且隐藏掉Rootkit存在的事实,这些东西我之前都写过,也没有必要在赘述了。简单起见,我用stap。

我的意思是,使用stap的语法会更加高效且安全,在编译期就避开了各种规避panic的debug工作,毕竟人生苦短啊。

然而,我上面的脚本依然使用了本地化的内联C代码,只怪我术业不精吧。

Java调用C的Jni,C调用汇编的内联汇编,stap调用C的本例,bpf调用内核API,都属于同一回事。

下面举一个纯粹点的例子,完全用stap的语法来改点东西:

#! /usr/bin/stap

probe kernel.function("tpacket_rcv")
{
	len = @cast($skb, "sk_buff")->len;
	if (len > 500) {
		@cast($skb, "sk_buff")->len = 10;
	}
}

很简单,我把数据包从协议头就截断了,显然抓取的ping -s 1000大包都无法识别

# 直连机器 ping 100.100.100.1 本机抓包如下
[root@localhost ~]# tcpdump -i enp0s9 -n -v
tcpdump: listening on enp0s9, link-type EN10MB (Ethernet), capture size 262144 bytes
15:32:18.379180 IP [|ip]
15:32:19.403423 IP [|ip]
15:32:20.427958 IP [|ip]
15:32:21.451891 IP [|ip]
^C

虽然抓包被截断了,可是为什么ping也ping不通了呢?

因为Linux内核抓包处理函数并没有copy一份新的skb,而仅仅是increase了skb的引用计数而已,因此在tpacket_rcv中修改了数据包,那就修改了数据包本身,所以说,如果仅仅希望影响抓包效果,那么在抓包函数return的时候,一定要把包改回来,这也就是为什么要probe return的原因。

如果你想丢包,那就把数据包改坏吧:

  • 基于元组match来损坏数据包,OK。
  • 随便修改TCP/UDP的内容导致校验码损坏,OK。

哦,现在是下班时间,我想给经理beat electric discourse.


浙江温州皮鞋湿,下雨进水不会胖。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值