ECSC课堂 | 3分钟 get 内存马查杀!

常规的Webshell基于文件类形式存在,而内存马是一种无文件攻击手段,因此也被称为不落地马或者无文件马

因为常规的Webshell有文件落地,所以被发现的机率较大。而内存马存在于内存中,降低被发现的概率,给检测带来巨大难度,通常被作为后门进行使用,持久化地驻留在目标服务器中。

1、内存马检测难点

内存马的类型众多

根据不同的脚本类型,存在各种触发机制不同的内存马,没有稳定的静态特征,易于混淆,常规的WAF安全产品难以检测。

各种类型的“马” 

内存马的存在形式

内存马仅存在于进程的内存空间中,系统层面的安全检测工具无法检测出内存马。

2、Java Servlet 内存马

Java Servlet 内存马攻击原理

Java Servlet 的实现原理,如下图:

客户端发起的web请求会依次经过Listener、Filter、Servlet三个组件,而内存马利用在请求过程中在内存中修改或动态注册新的组件,达到注入Webshell的目的。

Java Servlet 内存马检查方式

(1)使用工具Arthas发现内存马。Arthas是一款开源的Java诊断工具,基本使用场景是定位复现一些生产环境比较难以定位问题。可以在线排查问题,以及动态追踪Java代码,实时监控JVM状态等等。

java -jar .\arthas-boot.jar   #java应用进程PID,如下图:

输入Mbean 查看或监控 Mbean 的属性信息,根据哥斯拉内存马的特性,进行筛选出异常组件,如下图:

(2)使用cop.jar工具提取Java内存马。把工具放在网站根目录下,输入:java -jar cop.jar -p,如下图:

(3)使用D盾工具对.copagent目录进行查杀,如下图:

除上述Java Servlet内存马的查杀方法外,如需了解更加全面的内存马查杀方法,以及更多的网络安全技术,持续关注安胜网络哦~

更多推荐

ECSC课堂 | Apache安全事件排查

ECSC课堂 | 应急响应之Linux主机排查(一)

ECSC课堂 | 应急响应之如何快速定位Webshell文件?

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个基本的EtherCAT主站程序示例,使用了IgH EtherCAT Master库: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <signal.h> #include <ecrt.h> #define EC_TIMEOUTMON 500 #define MAX_SLAVES 10 static volatile int run = 1; static ec_master_t *master = NULL; static ec_master_state_t master_state = {}; static ec_domain_t *domain = NULL; static ec_domain_state_t domain_state = {}; static ec_slave_config_t *slave_configs[MAX_SLAVES] = {}; static ec_slave_config_state_t slave_config_states[MAX_SLAVES] = {}; void signal_handler(int signum) { run = 0; } int main(int argc, char **argv) { if (argc < 2) { fprintf(stderr, "Usage: %s <config-file>\n", argv[0]); return -1; } if (signal(SIGINT, signal_handler) == SIG_ERR) { fprintf(stderr, "Failed to set signal handler\n"); return -1; } if (ecrt_master_open(&master, EC_RTAI_MASTER_ID)) { fprintf(stderr, "Failed to open EtherCAT master\n"); return -1; } if (ecrt_master_get_state(master, &master_state)) { fprintf(stderr, "Failed to get master state\n"); goto cleanup; } if (master_state.slaves_responding == 0) { fprintf(stderr, "No slaves found\n"); goto cleanup; } if (!(domain = ecrt_master_create_domain(master))) { fprintf(stderr, "Failed to create domain\n"); goto cleanup; } if (ecrt_master_activate(master)) { fprintf(stderr, "Failed to activate master\n"); goto cleanup; } if (ecrt_domain_reg_pdo_entry_list(domain, my_pdo_entries)) { fprintf(stderr, "Failed to register PDO entry list\n"); goto cleanup; } if (ecrt_domain_activate(domain)) { fprintf(stderr, "Failed to activate domain\n"); goto cleanup; } int num_slaves = ecrt_slave_config_count(master); if (num_slaves > MAX_SLAVES) { fprintf(stderr, "Too many slaves (%d > %d)\n", num_slaves, MAX_SLAVES); goto cleanup; } for (int i = 0; i < num_slaves; i++) { slave_configs[i] = ecrt_slave_config_create(master, i+1); if (!slave_configs[i]) { fprintf(stderr, "Failed to create slave configuration %d\n", i+1); goto cleanup; } if (ecrt_slave_config_pdos(slave_configs[i], EC_END, my_syncs)) { fprintf(stderr, "Failed to configure PDOs for slave %d\n", i+1); goto cleanup; } if (ecrt_slave_config_sdo8(slave_configs[i], 0x6060, 0x00, 0x01) || ecrt_slave_config_sdo32(slave_configs[i], 0x6064, 0x00, 1000000)) { fprintf(stderr, "Failed to configure slave %d\n", i+1); goto cleanup; } if (ecrt_slave_config_map(slave_configs[i], my_pdo_entries)) { fprintf(stderr, "Failed to configure mapping for slave %d\n", i+1); goto cleanup; } if (ecrt_slave_config_dc(slave_configs[i], 0x0300, 1000000, 1000000, 0, 0)) { fprintf(stderr, "Failed to configure DC for slave %d\n", i+1); goto cleanup; } if (ecrt_slave_config_get_state(slave_configs[i], &slave_config_states[i])) { fprintf(stderr, "Failed to get slave configuration state for slave %d\n", i+1); goto cleanup; } if (slave_config_states[i].state != ECSC_PRE_OP) { fprintf(stderr, "Slave %d is not in PRE_OP state\n", i+1); goto cleanup; } if (ecrt_slave_config_enable(slave_configs[i])) { fprintf(stderr, "Failed to enable slave %d\n", i+1); goto cleanup; } if (ecrt_slave_config_get_state(slave_configs[i], &slave_config_states[i])) { fprintf(stderr, "Failed to get slave configuration state for slave %d\n", i+1); goto cleanup; } if (slave_config_states[i].state != ECSC_SAFE_OP) { fprintf(stderr, "Slave %d is not in SAFE_OP state\n", i+1); goto cleanup; } } while (run) { ecrt_master_receive(master); ecrt_domain_process(domain); ecrt_master_send(master); usleep(1000); } cleanup: for (int i = 0; i < num_slaves; i++) { if (slave_configs[i]) { ecrt_slave_config_disable(slave_configs[i]); ecrt_slave_config_destroy(slave_configs[i]); } } if (domain) { ecrt_domain_deactivate(domain); ecrt_master_deactivate(master); ecrt_master_remove_domain(master, domain); ecrt_domain_free(domain); } if (master) { ecrt_master_close(master); } return 0; } ``` 请注意,此示例假设您已经定义了以下内容: - `my_pdo_entries`:一个 `ec_pdo_entry_info_t` 数组,定义了您的PDO映射表。 - `my_syncs`:一个 `ec_sync_info_t` 数组,定义了您的同步对象。 - 每个从站的对象字典中,索引 0x6060 子索引 0x00 包含了一个 "Modes of Operation" 属性,索引 0x6064 子索引 0x00 包含了一个 "Target Velocity" 属性。 请注意,此示例还使用了一个 `MAX_SLAVES` 常量,限制了程序最多可以处理的从站数量。您可以根据需要调整此常量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值