热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

揭穿恶作剧重建TCP连接和进程之间的关联

是时候将把戏揭穿了。请先阅读下文:https:blog.csdn.netdog250articledetails108113329依照文章中所描述的把戏,我们hack一下两个

是时候将把戏揭穿了。

请先阅读下文:
https://blog.csdn.net/dog250/article/details/108113329

依照文章中所描述的把戏,我们hack一下两个进程的tcp连接的归属,首先给出hack之前的情景:

[root@localhost ~]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.56.110:22 192.168.56.1:55287 ESTABLISHED 1344/sshd: root@pts
tcp 0 0 192.168.56.110:22 192.168.56.1:55589 ESTABLISHED 4791/sshd: root@pts

然后,在实施hack之后,进程所属的tcp连接被交换了:

[root@localhost ~]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.56.110:22 192.168.56.1:55287 ESTABLISHED 4791/sshd: root@pts
tcp 0 0 192.168.56.110:22 192.168.56.1:55589 ESTABLISHED 1344/sshd: root@pts

如果系统运维或者其它管理员遇到这样的情况,他们到底要瞄准哪个进程来debug呢?

注意⚠️,我们要抛弃事后的预设,事实上,他们根本无法意识到连接被交换了,等到拉了一大堆人一起开完会后很久,他们或许才能意识到事情哪里有点不对劲。

如果有我在,这种事情就不会发生,作为手艺人,我更喜欢直接面对本质,而不是使用工具迂回,在我看来,通过procfs来查找tcp连接和进程之间的关联,就是迂回。

何不直接点儿呢?

来看下面的图:
在这里插入图片描述
如果通过那条 不可拆除的线索 来关联tcp_sock和socket,岂不是无需迂回?

OK,下面的代码描述了如何做:

#!/usr/bin/stap -g
// tcpstat(.stp)%{
#include
#include struct result {char laddr[16];char raddr[16];unsigned short lport;unsigned short rport;unsigned long ino;int pid;char comm[32];
};static inline void ip2str(char *to, unsigned int from)
{int size = snprintf(to, 16, "%pI4", &from);to[size] = '\0';
}void traverse(struct sock *sk, unsigned long ino, struct result *ret)
{struct task_struct *tsk;int i;for_each_process(tsk) {struct file *file;for (i = 0; i < tsk->files->fdt->max_fds; i++) {file = tsk->files->fdt->fd[i];if (file == NULL) {continue;}if (file->f_inode->i_ino == ino) {char laddr[16], raddr[16];ip2str(laddr, inet_sk(sk)->inet_rcv_saddr);ip2str(raddr, inet_sk(sk)->inet_daddr);memcpy(&ret->laddr[0], laddr, 16);memcpy(&ret->raddr[0], raddr, 16);ret->lport = sk->sk_num;ret->rport = htons(sk->sk_dport);ret->ino = ino;ret->pid = tsk->pid;memcpy(&ret->comm[0], tsk->comm, 32);}}}
}
%}function dump_tcp_info()
%{struct task_struct *tsk;struct inet_hashinfo *hashinfo = &tcp_hashinfo;struct hlist_nulls_node *node;struct socket_alloc *sa;struct sock *sk;struct result ret;int i, ino;for (i = 0; i < INET_LHTABLE_SIZE; i++) {struct inet_listen_hashbucket *ilb;ilb = &hashinfo->listening_hash[i];sk_nulls_for_each(sk, node, &ilb->head) {unsigned long ino;sa = (struct socket_alloc *)sk->sk_socket;ino = sa->vfs_inode.i_ino;traverse(sk, ino, &ret);STAP_PRINTF("LISTEN %s:%d inode:%d/[%d] %s\n",ret.laddr,ret.lport,ret.ino,ret.pid,ret.comm);}}for (i = 0; i <= hashinfo->ehash_mask; i++) {struct inet_ehash_bucket *head = &hashinfo->ehash[i];if (hlist_nulls_empty(&head->chain)) {continue;}sk_nulls_for_each(sk, node, &head->chain) {unsigned long ino;sa = (struct socket_alloc *)sk->sk_socket;ino = sa->vfs_inode.i_ino;traverse(sk, ino, &ret);STAP_PRINTF("ESTABLISHED %s:%d %s:%d inode:%d/[%d] %s\n",ret.laddr,ret.lport,ret.raddr,ret.rport,ret.ino,ret.pid,ret.comm);}}
%}probe begin
{dump_tcp_info();exit();
}

来来来,我们运行上面的脚本来试一下能不能把被hack的系统真相找出来:

[root@localhost test]# ./tcpstat
LISTEN 0.0.0.0:22 inode:22852/[1001] sshd
LISTEN 0.0.0.0:22 inode:22850/[1001] sshd
ESTABLISHED 192.168.56.110:22 192.168.56.1:55287 inode:25510/[1344] sshd
ESTABLISHED 192.168.56.110:22 192.168.56.1:55589 inode:28747/[4791] sshd

用这个结果来对比一下被hack后的情形:

[root@localhost ~]# netstat -ntp
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.56.110:22 192.168.56.1:55287 ESTABLISHED 4791/sshd: root@pts
tcp 0 0 192.168.56.110:22 192.168.56.1:55589 ESTABLISHED 1344/sshd: root@pts

哈哈,真相大白!

何为手艺人?不依赖大型工具,不依赖专业知识,小镇上修锅换底而无痕迹者是也。当然,皮鞋也能做。



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


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • Nginx使用AWStats日志分析的步骤及注意事项
    本文介绍了在Centos7操作系统上使用Nginx和AWStats进行日志分析的步骤和注意事项。通过AWStats可以统计网站的访问量、IP地址、操作系统、浏览器等信息,并提供精确到每月、每日、每小时的数据。在部署AWStats之前需要确认服务器上已经安装了Perl环境,并进行DNS解析。 ... [详细]
  • 本文介绍了在rhel5.5操作系统下搭建网关+LAMP+postfix+dhcp的步骤和配置方法。通过配置dhcp自动分配ip、实现外网访问公司网站、内网收发邮件、内网上网以及SNAT转换等功能。详细介绍了安装dhcp和配置相关文件的步骤,并提供了相关的命令和配置示例。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 本文介绍了在mac环境下使用nginx配置nodejs代理服务器的步骤,包括安装nginx、创建目录和文件、配置代理的域名和日志记录等。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • Centos7.6安装Gitlab教程及注意事项
    本文介绍了在Centos7.6系统下安装Gitlab的详细教程,并提供了一些注意事项。教程包括查看系统版本、安装必要的软件包、配置防火墙等步骤。同时,还强调了使用阿里云服务器时的特殊配置需求,以及建议至少4GB的可用RAM来运行GitLab。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了如何使用iptables添加非对称的NAT规则段,以实现内网穿透和端口转发的功能。通过查阅相关文章,得出了解决方案,即当匹配的端口在映射端口的区间内时,可以成功进行端口转发。详细的操作步骤和命令示例也在文章中给出。 ... [详细]
author-avatar
情人節快樂1991的名单
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有