标题很烂,但我不确定我想做的事情的正确术语,如果我知道的话,我现在可能已经找到答案了!
问题:
由于一个过度热心的端口扫描器(客户的网络监视器)和一个过于简单的telnet守护进程(busybox linux),每次端口23被扫描时,telnetd启动另一个实例/bin/login
等待用户通过telnet输入。
由于端口扫描器实际上没有尝试登录,因此没有会话,因此不会出现会话超时,因此我们很快就会以运行/bin/login
的十亿僵尸副本结束。
我想做什么:
telnetd
给了我们启动一些其他东西的选项(-l
) 而不是/bin/login
,所以我认为我们可以用bash脚本取代/bin/login
,杀死旧的登录进程,然后正常运行/bin/login
:
#!/bin/sh
# First kill off any existing dangling logins
# /bin/login disappears on successful login so
# there should only ever be one
killall -q login
# now run login
/bin/login
但这似乎立即返回(没有错误,但没有登录提示)。我还尝试将命令链接到telnetd的参数中:
telnetd -- -l "killall -q login;/bin/login"
但这似乎也不起作用(再次-没有错误,但没有登录提示)。我敢肯定我遗漏了一些明显的皱纹。
系统是嵌入式Linux 2.6。
EDIT: OK,我是一个不使脚本可执行的prat,完成后,我得到login:
提示,但在输入用户名后,我没有得到任何进一步的
检查脚本是否设置了执行位。权限应该与原始二进制文件相同,包括所有权。
对于-l
:我的猜测是,它试图执行命令killall -q login;/bin/login
(这是一个词)。
由于这是一个嵌入式系统,它可能不写日志。但无论如何,您都应该检查/var/log
是否有错误消息。如果没有,您应该能够使用文档配置它:http://wiki.openwrt.org/doc/howto/log.overview
对,我修复了它,因为我怀疑我遗漏了一个皱纹:
执行/bin/login
我需要exec
把控制权交给/bin/login
,而不是直接调用它。
telnet守护进程是这样启动的:
/usr/sbin/telnetd -l /usr/sbin/not_really_login
非真正登录脚本的内容如下:
#!/bin/sh
echo -n "Killing old logins..."
killall -q login
echo "...done"
exec /bin/login
一切正常,在telnet连接上,我们得到这个:
**MOTD Etc...**
Killing old logins......done
login: zero_cool
password:
我们可以像往常一样登录。
我唯一没有弄清楚的是,如果我们能检测到/bin/login
的退出状态(如果我们杀死它),并打印一条消息说Too slow, sucker!
或类似的。TBH虽然,这是一个细节,可以等待一个雨天,我只是高兴我们的东西不能被DDOS'通过Telnet了!