Stay Hungry.Stay Foolish.
Linux上定位socket的connect连接

使用内核提供的jprobe钩子hook住底层的sys_connect系统调用

问题起源

我有一台机器,上面跑着mysql, 查看日志发现有很多这样的行

170120 17:09:02 162429 Connect  Access denied for user 'xxx'@'localhost' (using password: YES)

有程序经常尝试连接我的mysql, 难道有人想干我?

定位

经常使用的手段就是抓包,这里踩到一个坑,因为最后发现是本地的程序连接的,所以包是环路,抓取的时候需要指定网卡为lo,比如tcpdump应该这样

sudo tcpdump -i lo

然后发现虽然可以抓到网络请求,但是不知道是哪个程序。

解决

最后在室友帮助下,写了一个钩子模块,安装模块之后使用dmesg查看就抓到了程序名

jprobe: task = xxx, pid = 29025, fd = 4, address = 127.0.0.1, port = 3306, addrlen = 16

xxx就是尝试连接我mysql的程序名。。然后干回去就行

Happy hacking,代码地址

PS: 最好的做法应该是使用kretprobe,把钩子函数放在sys_connect的ret指令前,但是抓取不全,有点小bug,还在解决,代码地址

自由转载-非商用-非衍生-保持署名(创意共享3.0许可证
评论
2017-01-20 13:38:39

有人想干你