RotaJakiro 双头龙,一个至少潜伏了3年的后门木马( 二 )

plain_len(明文长度)&7的值决定 。
以解密以下C2密文为例:
ff ba a2 3b cd 5b 7b 24 8c 5f e3 4b fc 56 5b 99 ac 91 cf e3 9a 27 d4 c9 6b 39 34 ce 69 ce 18 60其与解密相关的各种参数如下图所示,密文长度为32字节,明文长度为26字节

RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
首先使用AES解密后得到以下“次级密文”:
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
然后从次级密文中取出有效密文,其中有效密文从第8字节开始,长度为明文长度减8,此处即为26-8=18字节 。
98 1B DB D9 8B 59 19 5D 59 1B 59 D8 1D DC 8B D8 DB 5B最后通过明文长度26可以计算26&7=2,得到移位的次数,将上述有效密文逐字节左移2位,就能得到C2明文 。
blog.eduelects.com持久化RotaJakiro在实现持久功能时,对root/non-root用户做了区分,不同的账号采用了不同的技术 。
针对root账号的持久化实现
  • 根据不同Linux系统发行版本,创建相应的自启动脚本/etc/init/systemd-agent.conf或者/lib/systemd/system/systemd-agent.service
    Content of systemd-agent.conf-----------------------------#system-daemon - configure for system daemon#This service causes system have an associated#kernel object to be started on boot.description "system daemon"start on filesystem or runlevel [2345]exec /bin/systemd/systemd-daemonrespawn Content of systemd-agent.service-----------------------------[Unit]Description=System DaemonWants=network-online.targetAfter=network-online.target[Service]ExecStart=/usr/lib/systemd/systemd-daemonRestart=always[Install]
  • 用于伪装的文件名,俩者2选1
    /bin/systemd/systemd-daemon/usr/lib/systemd/systemd-daemon
针对non-root账号的持久化实现
  • 创建桌面环境的自启动脚本$HOME/$.config/autostart/gnomehelper.desktop
    [Desktop Entry]Type=ApplicationExec=$HOME/.gvfsd/.profile/gvfsd-helper
  • 修改.bashrc文件,创建shell环境的自启动脚本
    # Add GNOME's helper designed to work with the I/O abstraction of GIO# this environment variable is set, gvfsd will not start the fuse filesystemif [ -d ${HOME} ]; then${HOME}/.gvfsd/.profile/gvfsd-helperfi
  • 用于用于伪装的文件名,俩者同时存在
    $HOME/.dbus/sessions/session-dbus$HOME/.gvfsd/.profile/gvfsd-helper
进程守护RotaJakiro实现了进程守护以保护自身的运行,和持久化一样,对root/non-root用户有不同的实现方式 。
针对root账号的进程守护实现在root账号下运行时,根据不同Linux系统发行版本,通过向服务的配置文件中写入Restart=always或者respawn,当服务进程被结束时,会自动创建新进程 。
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
实际效果如下图所示,可以看到systemd-daemon进程被结束后,立马就生成了新进程 。
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
针对non-root账号的进程守护实现在non-root账号下运行时,RotaJakiro生成session-dbusgvfsd-helper俩个进程,它们监控着彼此的存活,当其中一方被结束时,另一方将其恢复,这是非常典型的双进程保护 。
RotaJakiro的双进程保护是如何实现的呢?首先以shmget API创建一片共享内存,session-dbus和gvfsd-helper通过这片共享内存实现进程间通信,告诉对方的自己的PID 。然后通过/proc/[PID]目录,动态地获取进程的存活情况 。当发现对方进程死亡时,通过execvp创建进程,帮助死亡一方“复活”,大致流程如下图所示:
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
实际效果如下图所示,可以看到session-dbusgvfsd-helper被kill -9结束后,新进程立马就创建了 。
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
单一实例RotaJakiro通过文件锁来实现单一实例,具体实现如下所示:
RotaJakiro 双头龙,一个至少潜伏了3年的后门木马

文章插图
其中用到的lockfile在root/non-root账号下有所不同 。
  • root下的lockfile,2选1
    /usr/lib32/.X11/X0-lock/bin/lib32/.X11/X0-lock
  • non-root下的lockfile,同时存在
    $HOME/.X11/X0-lock$HOME/.X11/.X11-lock
以实际中non-root账号为例,通过


推荐阅读