Metasploit-Payload修复Unicode支持

前言

  • 在使用metasploit的时候难免会遇到一些操作会用到中文,比如执行带用中文路径的文件,进程返回和窗口信息返回中出现中文乱码的情况,在修改Metasploit源码都无法实现的情况下就要重新编译metasploit-payload进行修复。
  • 下面对不支持执行带有中文路径进行修复简述。

目前状况

  • 无法执行带有中文路径的文件

Untitled

  • 对执行文件整个流程的跟踪,在命令调度器中对client.sys.process.execute传递的参数,并没有异常。

Untitled

  • 到了发送到客户端前的编码也没有问题,所以只能是metasploit-payload中出现bug了。

Untitled

  • fork一个主分支到自己的github,克隆到本地,开发环境为VS2013。
git clone https://github.com/cn-kali-team/metasploit-payloads
  • 因为metasploit-payload中用到了很多其他的开源项目,所以需要初始化子模块
git submodule init && git submodule update
  • 进程处理这一块都是在stdapi这一个插件里,使用VS2013打开ext_server_stdapi这个工程项目中的process.c文件。

Untitled

  • 定位调用接收PATH参数的地方也很简单,直接搜索在Metasploit源码中找到的TLV_TYPE_PROCESS_PATH就可以找到了。
  • UNCICODE支持可以看官方的wiki,但是现在接口已经变了,但是主要的思路没有变,就是官方提供接口将utf8和wchar两种编码互换,只要新加一个变量,将你想用到的编码转换后赋值给这个变量就直接可以用了。
  • wiki中的转换方法是:
wchar_t *utf8_to_wchar(const char *in);

char *wchar_to_utf8(const wchar_t *in);
  • 新的方法都移到了一个通信统一的api接口:
met_api->string.wchar_to_utf8(name);
met_api->string.wchar_to_utf8(path);

Untitled

  • 详细修改请看我提交的PR,这里只是将CreateProcessWcommandLine_w修复Unicode支持。

Untitled

  • 编译成功后会生成对应的dll文件,将ext_server_stdapi.x86.dll文件复制替换掉你原来的文件,例如我的ruby开发环境下的模块路径为:.rbenv\versions\2.7.2\lib\ruby\gems\2.7.0\gems\metasploit-payloads-2.0.23\data\meterpreter\ext_server_stdapi.x86.dll

修复后

Untitled

  • 按照metasploit-payload的官方wiki,下载DebugView,以管理员权限打开,设置拦截全局Win32调试信息。

Untitled

  • 在项目的common.h文件中修改# define DEBUGTRACE 1调试标志为真,在你想调试输出的地方加上dprintf([format string]),你想打印的信息。
  • 再次运行木马就可以查看调试信息了。但是这还不如我自己用x64dbg附加进程调。

Untitled