当前位置:首页 > 焦点

msfconsole报错from

打开msfconsole,报错敲完命令回车,报错屏幕上跳出一行红字:from。报错没头没尾,报错就一个单词。报错第一次遇到的报错人大概率会愣几秒——这算什么报错?连个堆栈都没有,连个文件路径都不给。报错

我碰到这个是报错在一台Ubuntu 22.04的机器上,Metasploit Framework从apt装的报错,版本6.3.x。报错当时想跑一个auxiliary的报错扫描模块,结果刚进console就报了。报错不是报错每次都有,大概十次里出现两三次,报错重新开一个终端又正常了。报错这种间歇性抽风最烦人。

先说结论:这个from几乎不是Metasploit核心代码抛出来的,而是Ruby解释器在加载某个gem时炸了,错误信息被截断,只剩了关键字。Ruby的异常输出格式里,from通常出现在backtrace的第二行开头,比如:

/usr/lib/ruby/vendor_ruby/xxx.rb:12:in `require': cannot load such file -- yyy (LoadError) from /usr/lib/ruby/vendor_ruby/xxx.rb:12:in `<top (required)>'

正常情况下你会看到完整的两行。但如果某个环节把标准错误重定向或者截断了,就只剩一个孤零零的from。所以看到它,第一反应不该是去搜“msfconsole from error”,而是想办法把完整错误挖出来。

怎么挖?最直接的办法是绕过msfconsole的启动包装脚本,直接跑Ruby入口。Metasploit的console入口一般在/usr/share/metasploit-framework/msfconsole,这是个shell脚本,最终调用的是msfconsole.rb。手动执行:

cd /usr/share/metasploit-framework ruby -e 'require "./config/boot"; require "./lib/msf/ui/console/driver"' 2>&1 | head -50

或者更粗暴一点,直接改msfconsole脚本,把最后执行ruby的那行加上--debug或者把stderr输出到文件。我自己的习惯是:

RUBYOPT="-W0" msfconsole 2> /tmp/msf_err.log

然后看/tmp/msf_err.log。多数情况下,完整的LoadError或者NameError会老老实实躺在里面。我那次看到的实际错误是cannot load such file -- rex/arch/arm,某个gem版本对不上。删掉重装metasploit-framework的依赖包就好了。

还有一种情况是Ruby版本冲突。系统里同时存在rvm装的Ruby和apt装的Ruby,msfconsole脚本里的shebang指向了错误的解释器。这种时候from后面什么都没有,因为解释器自己就挂了。检查which ruby和head -1 $(which msfconsole),看看两边是不是一套。

Windows上也有类似案例。用官方installer装的Metasploit,某个Windows更新之后msfconsole启动就报from。原因是installer自带的Ruby环境里,某个native extension的DLL被系统更新覆盖了。重装Metasploit installer能解决,但更彻底的做法是别用installer,直接上WSL。我在Windows上折腾Metasploit的经验就一条:能不用原生Windows就不用。

Kali Linux里这个报错反而少见,因为Kali的包管理把依赖锁得很死。但如果你手动gem install过什么东西,把系统gem搞乱了,那from就会冒出来。修复方式:

gem cleanup apt install --reinstall metasploit-framework

别用gem update去动Metasploit的依赖,Kali的包和gem源经常打架。

说到底,from这个报错本身信息量约等于零。它就是个信号:有东西在加载阶段炸了,但错误输出被吞了。处理思路永远是先恢复完整错误信息,再对症下药。直接搜这个单词,搜出来的结果八成是误导。

我现在养成一个习惯,任何Ruby工具报这种残缺错误,先2>&1 | tee /tmp/err.log,再看log。比在终端里瞎猜快得多。

分享到: