Unix源码分析

霍林老师是我在大学中给我影响也相当大的一位老师。在给我们上数据结构和操作系统的时候,她展现了对于计算机的透彻理解,她的教学目的是让我们把所学知识融会贯通,并且将思想融入到各个领域。霍老师曾用战场比喻计算机技术,战车、兵马、枪炮是数据结构,而高效利用它们取得胜利的则是战术,也就是算法。
在我阅读ATT&CK一书后,昔日恩师所说的话冒上心头,感慨计算机确实是万变不离其宗。在霍老师的汇报上,老师向我们介绍了我国信息安全产品,也给我们灌输了信安的观念,从底层原理展开描述了老师对安全的理解。我思考,不想做脚本小子,要依靠自己的能力构建安全长城,就要真正从底层理清楚框架,从学习操作系统开始。
我选择学习Unix源码,他是众多os的鼻祖,尽管距离它出现已过去几十年,技术也趋于老旧,但是如今的linux、macos等等都是基于unix实现的,因此学习它很有必要。霍老师打趣道,现在给我们上课的内容还是以前她学过的内容,越是底层的东西越难发生大的变化。而且unix源码10000行左右,我有信心读完,这篇文章既是学习笔记也是备忘录,更是自己主动学习的有力证明。

我先做的,是先通读《unix内核源码剖析》

可以查看源码的网站

一、unix v6

unix诞生在1969年,V6在1975年发布

unix v6内核提供的功能:
①管理运行的进程
②内存管理
③文件系统
④文件和周边设备共享I/O
⑤中断
⑥支持终端处理

在学习操作系统的时候,对于进程管理、内存管理、文件系统等就有所学习,不过距离现在时间过得久了,印象不深了,现在就是重学习的时候。

构成unix v6运行环境的硬件:
①PDP-11:这是一个处理装置,书中以PDP-11/40这个16位计算机作为示例。也就是说它以16bit为单位对数据进行处理。处理器处理数据的单位是:字(word),一个字=16bit

PDP-11/40通过unibus进行数据的输入输出,使用内存映射(Memory Mapped I/O)人们可以对操作系统的寄存器进行操作。注意,这些寄存器被映射到内存最高位的8KB空间,内存地址是从上到下看的,最上端是0,最下端是最高位。

②PSW状态字寄存器
PSW有16位。从0到15代表不同的状态

③通用寄存器
有R0到R7一共八个通用寄存器

④MMU内存管理单元
用于地址变换以及访问权限管理

⑤内存
PDP-11/40的内存被称为磁芯内存(Magnetic Core Memory)地址长度18bit,容量为218=256KB

⑥块设备
磁盘或者磁带

⑦行式打印机

⑧终端

二、进程

进程是程序资源分配的最小单位,线程是cpu调用的最小单位。进程由多个线程构成,切换进程开销大,而且资源不共用(可能会死锁),切换线程开销小,因为共用资源。在java中多线程用thread,我曾经写过的。
进程跟线程都可以分为五个状态:创建、阻塞、就绪、执行、终止。

内核先把程序读入内存,然后把这个内存区域分给进程,所以进程拥有独立的虚拟地址空间,可以先使用虚拟内存的地址,再由MMU内存控制单元映射到实际的物理地址上。
回忆进程的组成:PCB进程控制块(包含进程ID)、数据段、正文段。

进程是并行执行的,unix v6允许多名用户同时使用,所以在任意时刻,系统中可能有多个进程。回想学习操作系统和计算机组成与原理的时候,cpu会分时调度的,只需要以人不能感知的速度反复切换进程,就能产生同时操作的效果。分时系统(Time Sharing System,TSS)

用户模式和内核模式
处理器具有两种模式:用户模式、内核模式。处理器通过PSW来进行切换(PSW的13-12表示先前、15-14表示当前,00表示内核模式,11表示用户模式)
虚拟地址在用户模式的时候会映射到用户程序的内存区域;在内核模式会映射到内核程序的区域。内存映射的实现依靠MMU内存管理单元。内核程序在系统启动的时候就已经被读取到内存中
用户程序无法访问加载内核程序的内存空间,要想访问内核功能,必须通过系统调用(system call)提出访问请求(这是强制的)。当内核处理结束又会返回用户模式。
书中提到几个用于用户空间与内核空间之间读写数据的函数:
fubute()、fuibyte()、fuword()、fuiword()、subyte()、suibyte()、suword()、suiword()

交换处理
为了防止进程过多而瘫痪内存,内核会定期休眠,将重要度低的进程从内存转移到交换空间(swap out,换出),或者将交换空间中已经处于执行状态的进程重新恢复到内存(swap in,换入),这个过程称为交换处理,由系统启动时生成的进程执行。在操作系统学习的时候,对内存管理比如动态分区,有:
·首次适应性算法
·循环首次适应算法
·最佳适应算法
·最坏适应算法

proc结构体和user结构体
这俩结构体管理进程的控制信息和状态信息,PROC结构体常驻内存,USER可能会被移至交换空间
PROC结构体
由proc结构体组成的数组proc[],里面每个元素都对应一个进程。这个结构体管理着在 进程状态、执行优先级等与进程相关的信息中需要经常被内核访问的那部分信息
每当进程要切换的时候,内核会首先检查所有进程的状态,所以为了保证效率,proc结构体常驻内存。proc[]的长度决定了在系统中可以同时存在的进程的上限,proc[]的长度由常量NPROC定义。
proc[]中的一些元素,可以与学习操作系统时的知识串在一起,比如P_time是进程在内存或者交换空间存在的时间(秒),对缺页中断的置换算法:最佳置换(opt)、先入先出置换(FIFO)、最近最久未使用置换(last recently used,LRU),进程在内存中获得资源的时间就会被作为依据进行置换算法的判定。对于一些根据优先级判断的算法,proc[]中的P_pri越小优先级越高,用户可以通过修改P_nice的值来自定义优先级,默认为0。

【进程图像】:包含两个部分,一个是常驻内存图像,如PROC[];另一部分是可交换图像(swappable image),如PPDA、数据区域、栈区域等,可以被交换到磁盘上

USER结构体
用来管理进程打开的文件或者目录等信息。不像PROC结构体常驻内存,内核只需要当前正在执行的进程的USER结构体,所以它会跟着进程切换而发生改变,比如被移出内存。
书本给出一些名词:
口口口口 实效用户、实效组、实际用户、实际组
也被称为 有效用户、有效组、真实用户、真实组
我的理解是,当前登录的用户是真实用户,但是它的权限可以发生变化,比如su命令提高权限,它的实效就会变高,但是实际用户没有发生变化。

内核可以根据全局变量”U“来访问 进程的user结构体

进程内存分配
进程的构成除了PCB还有数据段和代码段。数据段和代码段是作为两个连续的物理内存区域被分配给进程,进程通过虚拟地址访问被分配的物理内存区域。
代码段:
代码段是只读的,用来存放程序指令的机器代码。用于复用代码,提高效率。它通过数组text[]进行管理,长度由user.u_tsize表示。
数据段:
存放程序使用的变量等数据,它不能被其他进程共享

数据段

就如上图所表示,数据段的物理地址和长度分别由proc.p_addr和proc.p_size表示。数据段从上到下(地址从低到高)表示成三部分:
①PPDA(per process data area)进程数据区:
·user结构体和内核栈区域构成
·长度为USIZE×64byte=1KB,从用户空间无法访问
·内核栈区域是内核处理时的临时工作区域,每个进程都有供内核模式使用的工作区域
②数据区域:
由存放全局变量或BSS等变量的区域和进程来动态管理内存的堆区域构成。
【bss段】用来存放未初始化的全局变量和静态变量。
如果要扩展堆区域,要使用系统调用完成,从虚拟地址的低位到高位方向进行(从上到下),长度由user.u_dsize表示。
③栈区域:
用来暂时存放函数的参数或者局部数据,长度会自动扩展。栈区域的扩展是从虚拟地址的高位往地位低位方向(从下到上)进行,长度由user.u_ssize表示。

虚拟地址空间
进程拥有64KB的虚拟地址空间,通过长度为16bit的虚拟地址访问物理内存,虚拟地址由MMU内存控制单元转换为长度18bit的物理地址。
也就是说本来虚拟地址为216=64KB,转换为物理地址为218=256KB
代码段位于虚拟地址最低位的地址,往后是数据段,在往后是栈区域,栈区域在虚拟地址空间最高位。
每个进程都有独立的虚拟地址空间,但是也会有共i想的代码段。

使用虚拟地址的好处:

①程序可以使用 以任意地址为起点的内存空间:
不需要考虑该虚拟地址和物理地址的对应关系,MMU内存管理单元会解决这个问题。
②实现对内存访问的管理:
不同于直接操作实际地址可能会误操作,使用虚拟地址如果越权访问会通过MMU触发异常,终止进程处理。
③提高内存使用率:
通过映射有效利用分段的碎片的物理地址。
【但】对于unix v6,代码段和数据段是与物理地址存在对应关系的

变换地址
MMU内存管理单元通过APR(Active Page Register)寄存器将虚拟地址转换成物理地址。
一个APR由一个PAR(page address register)寄存器和一个PDR(page description register)寄存器构成。
用户进程的APR的值保存在USER结构体中,当该进程进入执行态,会将保存在USER结构体中的值设置到用户进程的APR中。
APR从0到7一共有8组,PDP-11/40对于用户模式和内核模式都有对应的APR,通过切换PSW的当前模式(00或者11)切换APR。
psw:一共16位;左边是最高位(15、14),右边是最低位(0)。根据15、14的情况判断模式。
进程的虚拟地址空间是以 segment段或page页来管理的。1组APR对应一页。PAR用来保存与各页物理地址有关的信息,PDR用来保存各页的块(64byte为单位)的数量以及是否允许访问等信息。每一页最多分配128个块(8KB)
虚拟地址最左边的高3bit决定对应的页(APR),PAR(16位)的11-0bit决定了物理地址的基址地址的块地址,加上虚拟地址的12-6bit的物理内存的块地址,再加上虚拟地址的5-0bit作为块内偏移地址,得到最后的物理地址。

说人话就是:
①拿到一个虚拟地址,先看15、14、13bit找到对应的APR[i];
②再根据虚拟地址的12、11、10、9、8、7、6这7位得到APR[i]中的PAR块的编号;
③将该块的11、10、9、8、7、6、5、4、3、2、1、0这12bit作为物理地址的基址地址;
④虚拟地址的5、4、3、2、1、0这6位作为块内偏移量(也就是物理块的块内偏移量);
⑤这样得到17-6的物理地址基址地址+5-0的物理地址块内偏移量,得到一共18bit的物理地址

在之前操作系统的学习中关于分页管理学过的,有一个页表,页表里面是页号和块号的对应方式,一页是1024,如果逻辑地址是1011,页表中页号0对应块号2,那么转换为物理地址的过程为:1011÷1024=0,0对应块号为2,那么物理地址基址为块号×1024即2×1024=2048,偏移量为1011,所以对应的物理地址为2048+1011=3059

【内核之所以可以通过全局变量U(0140000)来访问执行进程的USER结构体,是因为内核对供内核使用的APR做了相对应的设定】内核将内核模式使用的编号为6(也就是APR[6]/PAR[6])的PAR设为被执行进程的数据段的物理地址(proc.p_addr)
这是由于地址0140000(oct八进制)的高位3bit是6(十进制),如下图

140000的进制

[书中统一将内核模式使用的APR成为内核APR,用户模式使用的就是用户APR]

三、进程管理

1.进程的生命周期:
①父进程通过 系统调用 fork 创建子进程(子进程复制了父进程的数据);
②父进程执行 系统调用 wait,开始休眠等待子进程处理结束;
③子进程获得控制权,然后通过 系统调用exec,将程序读取到内存并且执行;
④子进程对应的程序执行完后,会通过 系统调用exit 结束自身运行进入僵尸状态,将控制权归还父进程;
⑤父进程取得子进程的结果,并且清理子进程。

2.进程创建:
①子进程复制父进程的数据
·复制proc[]数组元素,并且子进程的proc.p_ppid指向父进程的proc.p_pid
·复制数据段。包括PPDA(per process data area);子进程的user.u_procp指向proc[]中代表子进程的元素;子进程和父进程共享text[]中的相同元素

②父进程与子进程的联系:
·父进程只能通过遍历所有proc.p_ppid指向父进程的进程才能找到所有它的子进程。
·父进程会回收子进程结束后释放的资源
·子进程继承父进程打开的文件和当前目录等数据
·父进程和子进程共享代码段。但是如果子进程执行其他程序,这种共享关系会解除。
·父子进程互不干扰

【unix v6允许父进程介入子进程处理的跟踪机制,用管道,也就是“|”来实现父子进程通信】
【面试常问进程通信:管道、信号、信号量、共享内存、sokect】

③系统调用 fork
fork是依靠内核进程处理系统调用

——到这里暂时看不懂了,看看汇编—–

OWASP2021

开放式Web应用程序安全项目(OWASP,Open Web Application Security Project),top10 展示了当前对web应用威胁最大应用最广的漏洞,学习目的在于了解当前最新的安全动态、走向,针对其内容更有针对性的学习安全,下图是owasp2021相较于2017的比较图,不难发现新增了三种威胁,而2017的威胁的排名在2021均有变化。

owasp2021 top10 分别是:

1.Broken Access Control 失效的访问控制
2.Cryptographic Failures 加密失败
3.Injection 注入
4.Insecure Design 不安全的设计 //new
5.Security Misconfigration 安全配置错误
6.Vulnerable and Outdated Components 易受攻击和过时的组件
7.Identification and Authentication Failures 认证和授权失败
8.Software and Data Integrity Failures 软件和数据完整性故障 //new
9.Security Logging and Monitoring Failures 安全日志和监控失效
10.Server-Side Request Forgery 服务器请求伪造 //new

总体来看信息安全问题归根到底还是人的问题,比如新上榜的不安全的设计,注入、安全配置错误、易受攻击和过时的组件,都是人为因素占比相当大。体现的是在当前信息化的社会里,很多信息、网络管理员的安全意识淡薄,对于自己配制的信息不熟悉,对其所在的企事业单位的信息系统整体框架不了解,对于当前信息安全发展动向不清楚,对新的安全技术学习不认真。

再仔细看,如果把top10中某些漏洞联系起来看,能发现一个趋势–内网安全问题变得严峻。我得出这个结论最重要的一个论据就是第十位新上榜的SSRF服务端请求伪造,攻击者使用这个技术来实现跨域、横向移动等战术。这说明越来越多的内部网络发现来自内网设备的攻击,这应该引起大家的注意,毕竟当前内网安全的保障仍需完善。

黄保华老师在课上曾不止一次提到,防止安全事故发生要做到两项极重要的事情,一个是访问控制,另一个是安全审计。2021 top10 的首位是失效的访问控制,即攻击者通过绕过等技术,以任意身份访问被限制访问的系统内部资源。显然倘若访问控制失效,攻击者就会如入无人之境。

对于安全审计,我预言不久之后随着防御技术更加成熟,以ATT&CK框架为代表的中级模型被广泛应用后,攻击者可能会采取更意想不到的战术、技术入侵、破坏信息系统。随后攻击者会将把重心集中在破坏审计这个环节。通过破坏审计,让已有框架的搜集功能失效,让上下文信息的联系断开,使得防守方应急速度落后于攻击者的攻击速度、导致防守方无法短时间内制定出方案,无法止损。并且即便处理了漏洞,也无法对事件起因进行分析,无法溯源,对于防御下一次攻击以及更新防御方案,更新防御技术框架十分不利。

基于这个预言,我认为从事安全行业的研究者必须提高警惕,通过改进、巩固,更新已有的安全审计技术和设施,找到更加先进,高效的方法使得攻击者的战术难以实现。我认为,隐写溯源技术,除了在保护版权、保护涉密文件有重大作用外,对于安全审计来说也能发挥其功能。鉴于隐写溯源技术未普及,仅作粗浅判断。目前隐写溯源技术主要还是将数字水印(包含操作人员、设备等秘密信息)利用隐写术嵌入如图像、音频、视频中,后期通过提取识别、验证数字水印实现防伪、溯源的效果。借鉴该思想,对于分析安全事件的核心日志等文件,也可以使用隐写溯源技术分布式的镶嵌在某处或者多处,当攻击者企图篡改日志、破坏日志、混淆数据的时候,我们可以根据水印来检测真伪并且一定程度上进行溯源。隐写溯源技术是具有鲁棒性、脆弱性、不可感知性的,我认为日后它将广泛应用于更行各业之中,本篇文章主要是学习owasp2021同2017的异同分析,对于隐写溯源就不再多描述了。

(ps:照这么发展,以后owasp top 10可能还会出现:失效的隐写溯源,哈哈)

下面我会结合网上优秀文章对新的top10进行讨论。

一、top1

新的top1是失效的访问控制(原top5),取代了注入。调查显示94%受测试的应用程序存在该漏洞。
我认为这很有可能是随着信息化的发展,各行业纷纷转型,而由于技术、资金、安全观念不足,大多企业会使用网上开源的代码,或者雇用经验不足的技术人员,又或者是企业内的技术人员的安全意识不够充分,引起安全问题。
展开来说,编写网站的程序员贪图方便照搬了网上开源的CMS源码,对于一些必须严格执行访问控制的功能点没进行检查。我们知道系统如果没有访问控制,会让非法用户任意跳转页面,或者操作资源。我们应该首先验证身份,再根据授权情况给予放行等操作。一般的验证方式要么写在每个功能页之中,要么就写在一个文件里,通过文件包含去应用所有功能页,我们还会使用cookie或者session、token等技术来快速验证身份。
问题就出在某些功能页没有写上验证代码或者没有引用验证代码,攻击者通过目录扫描技术很快就能找到这些文件,通过工具或者人工检查找到缺少验证的地方,就能直接绕开访问控制,实现跳转。

二、top2

新的top2是加密失败(原top3 敏感数据泄露),网上文章说这是“广泛的症状不是根本原因”,那根本原因是啥啊.……就我所学来看,加密失败与密码学发展有相关性,与当前加密技术、编码技术相关。比方说最普遍的MD5存在哈希碰撞,彩虹表,很多数据库中保存的密码仅简单的加密,很容易被破解为明文,连盐都不加,加密后的md5值放在在线工具一下子就被破解出来了。另一个影响比较大的是保存系统认证的密码、凭证等,如windows的LM Hash和NTLM Hash加密后的内容被破解,让攻击者能实现在内网中提权以及横向移动,危害性很大。
那么需要我们找到更安全的加密技术,比如采取国产加密算法等。同时它上升到top2应该引起人们对密码学关注,根据本人在学校密码学学习,我们用的技术趋于过时,存在极大的被破解风险,就比如随着计算机的算力提高DES都存在被暴力破解。而在未来量子计算技术很有可能打破现有大部分的加密方式。
加密失败举例子说明常见的找到配置文件,根据规则替换掉攻击者想要的密码。

三、top3

新的top3是注入(原top1)学习web安全首先接触的是SQL注入漏洞,xss漏洞(漏洞之王),注入的危害度相比以前有所下降,我想跟如今的安全技术提高有关。从1998年sql注入刚引起瞩目到2017年,这十几二十年的技术发展,频频爆出的注入漏洞一次又一次的提醒开发人员要对传进来的参数进行严格的过滤、控制,我很赞同那个观点–“一切来自用户的输入都是不可信的”。霍林老师在报告中提到,以往很多技术在设计之初是不考虑安全问题的,谁也无法预料未来攻击者会以何种方式找到漏洞并且攻击。比如SQL注入,设计之初没考虑好若有人存心构造payload闭合select语句会产生如此大的危害。
立足当下,我们依然要严格的对传入的参数进行严格的过滤、限制。

四、top4

新的top4是不安全的设计,这是新上榜的威胁,取代了原来的xxe漏洞。它的上榜体现了安全相关从业人员、开发人员正在寻求更多的安全模式,在设计应用或者流程之初就要考虑到安全性。
不安全的设计说白了类似上一点提到的,设计者在关键功能点没有进行细致的安全考虑,出现了验证的漏洞,支付逻辑漏洞,业务逻辑漏洞等安全问题。
比如前后端验证没做好,在某些支付逻辑漏洞中,仅通过修改物品的单价或者数量就能实现对最后价格的修改,0元购不是梦;再比如,任意密码找回,某些验证码的安全机制设计得并不完善,易被绕过;有的验证码不限制次数导致攻击者可以通过爆破求出验证码;还有的验证码允许复用,既先合法进行业务拿到合法的验证码,然后将该验证码用于找回其他任意账户的密码等,这些都是在逻辑上存在的安全问题。

五、top5

新的top5是安全配置错误(原top6),这仍是管理人员疏忽的地方,很多漏洞是基于某些框架、语言的特性利用的,比如php在低版本会存在一些魔术符号,若被错误开启,或者默认开启,攻击者会通过这些错误的安全配置进行攻击。在安全开发我们往往寻求最小特权原则,不必要的功能我们要严格限制,给予用户或者系统实现某种业务最基本的功能权限就足够了,比如一些仅用来留言的功能点,没必要配置其能够解析命令,又比如说宏病毒、eval函数,很多时候我们可以通过禁止宏、禁用eval函数来规避它们被攻击者恶意利用。
再者,我们应该更加注重自身的安全意识培养,对于使用框架或者其他情况,面对大量的可控配置,我们要熟知涉及到安全问题的配置信息,严格的遵守操作手册,对默认配置进行修改,对权限进行合理的增删。

六、top6

新的top6是脆弱的和过时的组件(原top9使用存在已知漏洞的组件)。不难看出这也是人为因素占据大部分责任的威胁。
在web应用、操作系统、数据库管理系统等诸多方面,为了实现不同的需求、便利操作,往往人们选择使用第三方组件、控件,那么这些组件出现安全问题将直接危害到它的载体也就是会危害设备或者系统。在去年年末爆发的log4j2安全漏洞,它是apache推出的日志系统,被广泛使用在apache的产品中,它存在任意代码执行漏洞,使用该组件的所有资产均受到威胁。

七、top7

新的top7是认证和授权失败(原top2)。说明标准化框架发挥了作用。它包括密码、密钥、会话token、用户信息以及与用户身份验证有联系的信息被篡改、伪造、破坏。
比如验证来源时可以通过修改HTTP报文中的数据来伪造来源;很多时候认证和授权为了便利仅进行对某些数据字段的验证,比如状态码,这是十分危险的,因为攻击者可以修改。

八、top8

新的top8是软件和数据完整性被破坏。这是新增的威胁,推测其要实现的战术,有破坏水印对被保护的资产进行恶意泄露;对生产环境的软件进行破坏,导致设备异常如大停电,可能与apt有关。

九、top9

新的top9是安全日志记录和监控失败(原top10)。该问题会严重影响可见性和取证,如我在本篇文章开头处做出的预言那样分析,此类威胁程度会越来愈严重,下次更新它的排名应该会更高。
查阅学习ATT&CK时,我注意到当前的一些高频攻击技术常常伪装自己,比如重命名,这个时候就需要防守方检测表里不一名字的情况,在安全审计的时候提高警惕。

十、top10

新的top10是服务器请求伪造SSRF,是新上榜的安全威胁。了解到它上榜的原因,其中一个是它是安全社区中呼声最高的,同我在文章开头所说的那用,我认为这是内网安全即将迎来下一波风险挑战的信号。

总结:
owasp 仅是一项参考基准,我们可以通过它来大致判断安全的未来走势,也应该通过了解它来加强我们的安全意识。老话重提,上述top10有相当多的威胁是本能避免的,事故就是出于人的疏忽,意识薄弱,或者在一些敏感问题上思想觉悟不够高。是人在贪图方便、利益等。
有时我们不能只掌握技术,还应该要有高度的自觉性,责任心,对社会负责更要对国家负责。

Forag上的项目学习

江江的爱

江宝推荐我的一个平台,可以在网上学习并且做一些项目,第一个项目是来自SAP(思爱普)的。

一、关于密码策略

这是这个项目的任务书,从上图的要求看出本项目与安全态势、身份验证有关。要符合ISO 27002用于信息安全控制。

  • 身份.csv:“4G$2U3j2$cm@3ur9u”
  • 客户端密码策略.pdf:“kAcC9N5u^a**#K3Hk”

接下来是阅读下载到本地的文件,看看用户的密码是否符合标准。可以帮助我思考在企业中能否发现相关的人的漏洞并且及时修正。

1.阅读密码策略,如下图,了解密码制定、维护的策略

①可以看到首先所有等级的密码都应该每90天更新一次;
②上面提到所有的产品 系统等级的密码必须来自安全密码数据库中;
③所有用户级别不能重复使用最近十次使用过的密码;
④密码不能以明文形式传播;
⑤所有用户、系统或者LEIN/NCIC级别密码还得遵循下面规则:

•在所有系统上的最小长度为12个字符
•不是一个字典上的单词或专有名称。
•与用户ID不同。
•过期时间不超过90个日历天。
•与前十(3)个密码不相同。
•不能在安全位置外以明文或明文传输。
•输入时不显示。
•确保只重置授权用户的密码。

之后对于删除密码的策略也要了解,主要是针对合约到期、员工离职等情况密码交接时,要根据策略对密码、账户进行一个删除工作。

任务部分:审计20个密码,判断是否符合。尽管我们用程序就可以识别,但是依旧需要我们本身就有安全意识。

二、关于钓鱼

审计了几封邮件,判断是否为钓鱼邮件

三、整一个Windowsserver2019

四、审计一份扫描结果,判断存在的弊端,给出建议,获取证书。

Powershell学习

在这段时间学习的感觉来看,众多攻击技术中powershell使用频次极高,攻击者若能在目标主机运行代码,那么它们就会下载powershell脚本(.ps1)到磁盘中执行,甚至可以直接在内存执行,因此有必要好好看看这部分知识。

首先powershell是windows自带的一个交互式命令行界面和脚本环境,攻击者可以利用powershell实现攻击。而攻击者选用powershell的重要目的在于它可以混淆命令来达到:
·绕过检测
·派生其他进程
·下载并执行代码和二进制文件
·收集信息
·更改系统配置

既然powershell这么广泛使用,那么它的特征将会是很明显的,我们可以先从他的利用方式找到其特征:
·执行命令
·利用编码命令
·混淆执行
·下载其他payload
·启动其他进程

那么检测powershell的方法最有效的就是检查命令行参数,还可以使用反恶意软件扫描接口(AMSI)来检测恶意的powershell,书中介绍了一些检测方式:
①命令加密
攻击者使用powershell的时候往往会使用编码和混淆来扰乱视听,那么我们可以想到检测使用编码和混淆的方法特征,去检查有没有可疑的参数,使用包含“-encodecommand”参数变体的命令行来监控powershell的执行情况。
变体例子:-e,-ec,-encode,-en等

②Base64编码
查找powershell.exe的进程以及包含Base64的相应命令行

③混淆
找到了被编码的数据,可能还被做了手脚混淆了,我们需要找到真正需要的内容。所谓混淆,可能存在压缩,拆解,重新组合等方式绕过检测。我们可以使用正则表达式(比如regex)提高检测准确度,去检测包含“^,+,%,$”等特殊字符的powershell命令

④可疑的cmdlet
从混淆中解开明文内容后我们开始分析。我们可以检测各种可疑的会进行恶意活动的cmdlet(powershell环境中的轻量级命令)、方法和进程参数,比如:invoke-expression(或者他们的变体比如iex,.invoke)、DownloadString、DownloadFile方法,或者如-nop、-noni这样比较特殊的参数。

⑤消除误报
很多时候合法用户也会使用编码等命令,所以会出现误报,这就需要我们懂得其中逻辑并且懂的判断。

再继续了解一下powershell吧
常见攻击工具:
①PowerSplit②Nishang③Empire④Powercat

在之前的内网安全学习曾经提到powershell使用,可以回过头看看。

CDN绕过

跟迪总学,记笔记
知识点:
·CDN知识-工作原理以及阻碍
·CDN配置-域名&区域&类型
·CDN绕过
·CDN绑定-HOSTS绑定指向访问

上了CDN之后,访问流程是这样的:
用户访问域名->cdn节点->真实服务器IP->访问目标主机

也就是说有些时候拿到权限可能只是CDN的权限,不是目的主机

之前我们也说过怎么知道有没有开CDN,如果在多地ping同一个域名出现不一样的ip地址,一般来说是开了CDN。
使用工具:超级ping,能实现从全国多地ping同一个域名

CDN配置:
·加速域名
·加速区域
·加速资源

CDN配置有关文章可以参考:
https://zhuanlan.zhihu.com/33440472

绕过CDN:

1.漏洞&遗留文件
遗留文件:当一个网站有phpinfo文件(用来调试php),会暴露服务器ip地址。注意到当没有配置内网网卡的话,会直接暴露真实ip,多个网卡就不一定是目标IP。
漏洞:ssrf漏洞,也可以爆出真实ip。
一般来说,正向访问CDN可能不能找到真实ip但是换个思路想,让CDN来找我们的时候就会暴露真实ip

2.子域名查询操作
当加速域名配置不包含子域名,比如加速了www.abc.com,而存在一个test.abc.com是没有被CDN加速的,也就是说访问这个test.abc.com会是真实ip,因为一般子域名和主站会绑定同一个IP

3.国外访问
其实能被国外访问找到真实ip,因为加速的时候选择加速的区域是国内。
【网站】https://tools.ipip.net/cdn.php
用非洲冷门国家去访问,效果好很多

4.主动邮件配合备案
很多站点有发送邮件的功能,而邮件系统一般在内部没有经过CDN解析,让目标主动发邮件会暴露目标真实ip地址。
比如,有密码找回,发送邮件之后在邮箱查看邮件能看到IP地址

有个网站直接看真实ip:
get-site-ip.com

5.fuckcdn
github上找这个工具使用

找到真实ip后要干嘛?修改hosts文件让以后域名与真实ip绑定
如在windows\System32\drivers\etc\hosts 写上ip地址与域名,ping域名就出来真实ip。
以后使用ip就不会误用节点的ip了

信息安全数学基础

作者:贾春福

第三章 同余

同余式中除法的性质:
1.一般的,若ac≡bc(mod m),且(c,m)=d,则a≡b(mod m/d)
2.当c|m,(c,m)=c,ac≡bc(mod m)→a≡b(mod m/c)
3.当(c,m)=1,ac≡bc(mod m)→a≡b(mod m)

[剩余类和剩余系]
剩余类:假设给定一个整数M,我们知道mod M的结果是 0到M-1,假如设定一个整数R,那么所有mod M之后等于R的整数构成一个集合,这个集合叫做模M的一个剩余类记为CR,剩余类是有限的。以M=5为例子,他就有C0,C1,C2,C3,C4,在每一个剩余类中任意一个整数可以叫做代表元,比如C1就可以用6做代表元

还是以M=5为例子,从C0到C4分别找一个代表元,这些代表元组成一个集合,叫做模M的一个完全剩余系(完系),注意,完系中的元素两两模M不同余

[欧拉定理和费马小定理]
欧拉函数:一个整数M,M的所有剩余类中与M互素的剩余类的个数。
以M=6作为例子,在模6的剩余类我取 {0,1,2,3,4,5},可以看到1,5跟6互素,所以6的欧拉函数是2.
对于素数的欧拉函数,是素数-1.比如M=7,7的欧拉函数=(7-1)=6
记得0跟任何数不互素,1的欧拉函数是1,2的欧拉函数是1,3的欧拉函数是2

[缩系/简化剩余系]:在与M互素的剩余类中找代表元组成的集合(元素个数是M的欧拉函数)
比如模6的缩系是{1,5}

[欧拉定理]:M>1,(a,m)=1,有 aφ(M)≡1 mod M

[费马小定理]:P是素数,对任意整数a,有 aP≡a mod P

φ(m1,m2)= φ (m1) φ (m2) //当m1,m2互素

φ (m)=m·(1-1/pi) //如 φ (240)= φ (24·3·5)=240·(1-1/2)(1-1/3)(1-1/5)=64

[扩展欧几里得]:用来求乘法逆元的,比如一份a要摸m得到1,即求a的乘法逆元a-1
a-1a≡1 mod m
方法如下图

【例】a=4,m=9
ri qi si ti
9 – 1 0
4 2 0 1
1 4 1 -2
0
∵(r0,r1)=snr0+tnr1=9×1+4×(-2)=1
∴4≡7 mod 9
【n为ri=0的上一个i】

[威尔逊定理]:P是一个素数,则(p-1)!≡-1 mod P

[线性同余方程]:f(x)≡0 mod m
若f(x0)≡0 mod m 则x≡x0 mod m,x0称为解
求解时,依次把数字(0至m-1)带入,如果算出的结果mod m 之后为0,就有解否则无解。

求解同余方程:

若m>1,(a,m)=d>1,d|b是同余方程ax≡b mod m的充要条件,如果有解,解的个数是d,
如果x≡x0 mod m,是特解,那么它的d个解为:x≡x0+(m/d)t mod m,t=0,1….d-1

[例题]:

[中国剩余定理]:

例子

以上图为例子
1.先计算m
m=m1+m2+m3+m4
2.再计算出M1,M2,M3,M4,M5,M6
Mi=m/mi //如M1=m/m1
3.然后计算M’,注意M·M’≡1 mod mi
4.计算方程组的解:x≡M1M’1b1+M2M’2b2+…+M4M’4b4 mod m


[同余方程组]:

解题思路是:
1.求d=(m1,m2)
2.求b1-b2
3.若d|b1-b2,有解且解模数为 [m1,m2]
4.后续计算如例子:
假设方程组为
x≡5 mod 12
x≡11 mod 18
d=(12,18)=6,b1-b2=5-11=-6,6|-6,所以有解,模数为[12,18]=36
令x=5+12k,然后带入x≡11 mod 18中得
5+12k≡11 mod 18
12k≡6 mod 18 //可以两边除去6得
2k≡1 mod 3 //求出k为2
K=2+3k //把新求出的K带入x≡5 mod 12k 中得
x≡5+12(2+3k) //化简后得
x≡29+36k mod 36
x≡26 mod 36 //此为方程组的解,若下面还有式子,用本条继续使用同样的方法算。

下面一个例子:

例子

第四章 原根与指数

[次数]:因为aφ(m)≡1 mod m,当a得l次幂≡1 mod m,l< φ(m) ,就说l是a对模m得次数

记作ordm(a)

找次数就可以一个个试,从i=1试到i=m-1,如下图

当存在一个整数n是ordm(a)得整数倍,即 ordm(a) |n,有an≡1 mod m

次数的一些性质,如下图

由于次数有以上性质,所以计算的时候可以简化,例子如下:

信安数学得知识虽然底层但是十分重要,之前学了怎么求同余方程,下面的知识点,在求指数上派上用场

求s和t就不难算

下面是求an模m得次数求法,是之前学过的推广,如下图

下面是一些性质,重要


【原根】:

要判断原根的方法:

下面是很重要的知识点,如果一个数有原根,那么原根数量是知道的,如下图

怎么判断一个数有没有原根呢?如下图:

原根存在条件!!!

找原根的方法,如下图:

如图,我们找到m得欧拉函数中的所有素因子

从2开始试,直到找到所有g不恒等1的元素,他们就是原根,举例子:

找到一个最小的原根了,下面是要把所有的原根找出来,方法是找到φ(m)=40的缩系,然后把里面的元素挨个放到6头上算,就能得到所有原根,如下图:

找到了缩系

[指数与高次剩余]

指数也叫离散对数




也就是用到4.1.3的知识,注意涉及指数,会频繁使用mod φ(m),比如下面的定理

与一般的指数,对数思路一样,可以得到一些性质方便计算,如下:

下面是几个重要的定理,用于计算:


下面是求n次剩余

下面求二次剩余

下面是求同余方程的例子:

第五章 二次剩余

定义如下图

求解二次同余方程的例子:

梳理一下解题思路:
1.首先求d,也就是用中学的判定条件来算,d=b2-4ac //在这里是(-6)2-4×5×2=-4
2.然后设 y2≡d mod m //这里是y2≡-4,而-4≡9 mod 13,所以y2≡-4≡9 mod 13
3.根据上面的式子求出y的解,y1,y2 //这里是解出y的解是3,10,因为3×3=9,模13是9,10×10=100,模13是9
4.列出2ax≡y-b mod m的式子 // 这里是2×5=10,y的解是3和10,所以y-b是3-(-6)=9,10-(-6)=16
即 10x≡9 mod 13 ; 10x≡16 mod 13

5.根据x≡x0=(2a)-1·(y-b)算出解 //这里2a是10,所以算出10模13的乘法逆元是4,因为4×10=40,40≡1 mod 13,y-b是9和16,x的解是4×9=36≡10 mod 13;4×16=64≡12 mod 13

也相当于对m素因数分解,x2≡a(mod pi),pi是m的素因数

判断二次剩余和二次非剩余的方法:
【欧拉判别条件】:如下图

对于模p的二次剩余以及二次非剩余的个数,可以用下面定理求出,如下图:

[勒让德符号]:便于我们计算二次剩余判别式

下面是勒让德符号的一些性质:

下面写一道例题,如下图

把-46拆成-1×46,因为17 mod 4 为1,所以(-1/17)=1;然后算(46/17),46≡12 mod 17,再把12分解成3×4,因为4可以写成22,而平方数的勒让德符号肯定为1,结果化简为(3/17),根据判别式得出结果

下面是常用的结论:

也可以写成
1 p=8m±1
-1 p=8m±3

当a=奇数的时候

下面算一个例子:计算(6/53)
因为6可以写成2×3所以原式子改成(2/53)(3/53),因为53=8×7-3,所以原式子写成-(3/53),因为此时a=3是奇数,用定理5.2.6,计算出(53-1)/2=26,即计算(ak)/p,k从1取到26.注意到没必要全部算完,(ak)/p是要向下取整的,知a=3时,3×17=53,所以当1<=k<=17的时候,结果是0
当18<=k<=35(因为3×35是53的两倍)的时候,结果是1.对于这个题相当于从k=18开始到k=26一共是9个1相加,因此算的这一串结果是1,所以原式子变成(-1)(-1)=1

下面是一个推论,整数a,b都与p互素,那么有

[高斯引理]:

对于a是奇数时运算太复杂,此时我们可以用二次互反律来求解,如下图

二次互反率,使用时记住当q和p都奇素数的时候才行

【雅可比符号】对勒让德符号的展开

使用雅可比符号,m要是正奇数(不是奇素数)注意,雅可比符号的一些性质:

类似勒让德符号运算,雅可比符号有:

雅可比符号二次互反律跟勒让德符号计算一样:

记住,勒让德符号p、q都是奇素数,雅可比符号m是正奇数。

归纳一下如何计算勒让德符号:
1.首先看p、q都是奇素数
2.当q超过p的一般,考虑取q-p作为新的q,此时q是负数
3.将(-1/p)提出来,根据5.2.3,判断(p-1)/2
4.将q分解成a×b,如果a或者b是2,根据5.2.5判断(p2-1)/8
5.若a或者b是奇数,利用二次互反律求出
6.得出结果,注意细心检查

下面是两道例题:

好难,我跳过,进行第六章的学

第六章: 群

【半群】

当班群满足一些条件,他就是群

需要记忆的一些集合!

下面是一些定理:

下面是判断群的阶

判断阶

下面是阿贝尔群的定义

————–注意,之后用“1”表示群的单位元,用a-1表示a的逆元 ————-

因为存在唯一的逆元,所以当对式子ax=b等号两边同时乘上a-1,x=a-1b,因此是唯一的

下面是群中元素的性质:

下面是关于阶的定义

注意,这里的“1”是指群的单位元!

下面是例子

定理:


[子群]:

{1}和G本身,是G的平凡子群

下面是一个定理:

[正规子群]:

下面是定理:


[循环子群]:

[循环群]:

与讨论原根相似,通过一些条件可以判断生成元,如下:

也就是说找到一个与n互素的k,ak就是G的生成元

6.3.2也就是说当找到这个k的时候,G就可以表示成G=<ak>即G=<1,(ak),(ak)2…(ak)n-1>如果有生成元,数量也是知道的,如下

下面是一些定理:

云里雾里,书本写到了由给定子群构造新的子群

下面是研究如何从给定的子集推出子群

下面是定义

引申的定理

实在是顶不住了,这本书里面的知识点太难懂,我去b站看视频学
【循环群】:群G中每个元都能表示成一个 a的方幂,那么G就是由a生成的循环群,记G=<a>,a是生成元。
【培集与商群】:群和子群是有很多关系的
[左培集]:

G中一个元素a和G的一个子群H组成的aH是H的左培集

aH是一个集合,里面的元素是G中任何元素a跟

[左培集关系]

【拉格朗日定理】

人话就是,如果H是G的子群,那么H的阶数是G的阶数的因子,

[商集和指标的概念]

下面是几个定理:

商群:


【同态和同构】

解释上图,“·”和“*”都是表示乘法,映射是x中每一个都能在y找到对应的结果,可以多个x对应一个y,但是不能一个x对应多个y。 从b站视频学习到其中需要 保持乘法
简单地说就是f(x1·x2)的结果在y里能找到,f(x1)*f(x2)的结果也能在y找到,并且这两个结果一样

回忆单射满射:
单射,x与y一一对应
满射,y中所有都被映射
双射,即单射又满射


下面是定理:

下面是同态的核跟像的概念,看下面截图

解释上图,首先f(a),表示在G中找到了S的映射。那么所谓的核,指的是先从G找到G的单位元,然后在S中找到是哪个元素映射出的,这个来自S的元素就是ker f,核
像,就是在G中找到每个S映射过来对应的元素。

下面是一些定理:

下面是一些重要定理,需要用到6.2.3正规子群的概念,如下

[同态基本定理]

第七章 环

环,是具有两种运算的代数结构

子环的概念:

零因子概念:

下面是一些定义:

如上图,后面默认环都是交换幺环。注意,因为是半群,有了幺元不能有逆元,否则就变成群了。 阿贝尔群就是交换群的意思。

下面是一些性质:


下面是运算时的一些定理

下面是一些定义

同态方式跟群的方式一样,只不过是加跟乘都要算

[环上多项式]

【常多项式】:只含有常数项的多项式的集合该集合里的元素被称为常多项式


【理想和商环】

通俗来说就是找一个比R小的环I,RI包含于R,从R和I中找r和i,ri∈I

理想类似群的培集

死记硬背!

这道题,首先构造4个元素,死记硬背“0”、“1”、“x”、“x+1”
不可约多项式,死记硬背x2+x+1,并且Z2表示结果mod 2,所以加法出现2就会被mod 掉消失。而在乘法中,不能出现x2,当出现时要“-”不可约多项式 x2+x+1 ,比如x×x=x2,此时减去不可约多项式之后mod 2 为x+1.

如果构造9个元素, 0,1,2,x,x+1,x+2,2x,2x+1,2x+2,其中不可约多项式是x+1

看不下去了,下面直接第八章

第八章 域

【域上多项式】

判断多项式是否可约:

第九章 椭圆曲线

以作业例题为例子解析:

首先死记硬背:y2≡x3+ax+b

然后题目会给出Ep(a,b),如例题:

其中p=17,意思要mod 17,点(1,1)表示a=1,b=1,代入式中: y2≡x3+x+1

算出mod 17的二次剩余,有(p-1)/2个二次剩余即(17-1)/2=8个,所以y从±1算到±8,得出对应的二次剩余,用y2 mod17来算得到1,2,4,8,9,13,15,16这8个数。

然后根据0到p-1也就是0到17-1=16来找x对应的y2=x3+x+1的数,从这些数中找到mod 17的二次剩余,如在第二个表中的y2=1,在第一张表里y2对应的y是±1,然后找到对应的x,比如y2=1的x=0,那么点就是(0,±1)。同理,找到符合的所有x,随后找出所有的点。

找到所有的点后,还要加上“无穷远点O”

希望考试顺利!





密码学复习

大四开了两门课,《信息安全数学基础》、《密码学》,临近期末考试,复习一下学过的知识

关于《密码学》老师说没有足够的课时,只能给我们讲一下常用的算法,在学习时可以看到密码学依赖于信息安全数学基础的学习,不过信安数学有点不太容易理解.

着重复习几个章节,首先是第三章的传统加密:

对称加密五部分:
明文
加密算法
密钥
密文
解密算法

密码编码学三特性:
1.转换明文为密文的运算类型
所有加密算法基于:代替和置换
2.所用的密钥数
用同一个:对称密码
用不同的:非对称密码,公钥密码
3.处理明文方式
分组密码:每次处理输入的一组数据,每次输出一组
流密码:连续处理输入的数据,每次输出一个

对加密信息的攻击类型
攻击类型 已知
唯密文攻击 加密算法;密文
已知明文攻击 加密算法;密文;用同一个密钥加密的一个或者多个名密文对
选择明文攻击 加密算法;密文;分析者选择的明文,对应的密文
选择密文攻击 加密算法;密文;分析者选择的密文,对应的明文
选择文本攻击 加密算法;密文;分析者选用的明文以及对应的密文;分析者 选择的密文以及对应的明文

——–代替技术————–

Caesar凯撒密码

C=E(N,P)=(P+N)mod (26) //每个后移n位

P=D(N,C)=(C-N)mod (26) //解密

playfair密码

playfair密码是多字母代替密码。基于一个5×5的字母表,其中i/j看作是同一个如下图

密钥是monarchy,从左到右去掉重复的摆在格子里,剩下的按顺序

playfair算法一次加密两个字母,规则如下

加密规则

hill密码

vigenere维吉尼亚密码

这是多表替换密码

首先根据密钥以及明文长度把密钥拓展到与明文一一对应之后,每个明文都单独加密

Vernam密码

———–置换技术—————–

栅栏密码

轮转机

第四章:分组密码和数据加密标准

会涉及DES、AES算法

现在使用大多数对称分组加密算法都是基于Feistel分组密码结构

DES加密

两个输入:明文、密钥
DES明文长64位,密钥长56位

以课本例题讲解
如下面图1,题目给出明文和密钥,我们先把他们的二进制格式写出来,然后从1开始标号方便后续查表。

图1 明文和密钥一样,化成二进制

1.现在要求出第一轮子密钥c0,d0,通过查下面图2的信息,找到密钥二进制位数对应的数字

图2 通过该表找到密钥对应的数字,置换成56位的子密钥

原本64位的密钥通过置换变成56位的子密钥,如下图3

图3 c0和d0是从56位子密钥对半分开的

然后c0和d0同时左移一位,见下图4

图4 循环左移

然后我们把c1,d1合并成一个56位的数据集,通过另一个表,见下图5来置换数据得到48位的子密钥K1

图5 通过此表把56位数据压缩成48位

得到了48位的子密钥K1,如图6

图6 子密钥K1

2.现在我们来对明文进行处理,根据下图7的表,对64位的明文进行置换

图7 根据此表置换明文

然后把置换好的明文拆分成位数一样的两个部分,记作L0和R0,既左半边和右半边,如图8

图8 置换后的64位

3.根据DES算法步骤,现在要对R0进行E扩展,此时L0不做改动,记为E(R0),目的是把32位R0扩充为48位,方法是把每四位的前、后一个数据加到头尾,如下图9,以1111为例,扩充后为01110,0000扩充后是100001

图9 扩充后的R0

4.接下来要用E(R0)和子密钥K1进行异或,注意到此时两者都是48位,结果如图10

图10 把E(R0)和K1异或的结果

5.随后我们要根据S盒来进行置换,因为分为了8组,因此有8个s盒子,记为S1-S8,置换的方法是,根据刚才扩充好的数据,以 0 1110 0 为例子,原数据是 1110 以左右两边 0 0 进行扩充,我们把扩充的 00看作是S盒的行号,原数据 1110 看作是S盒的列号,以此来进行置换(注意每次用的S盒不同),方法也可用下图11来计算

图11 通过S盒置换

5.把S1到S8置换后的数据拼接在一起,组成32位的数据,记为B,结果如下图12

图12 S盒置换后的结果拼凑在一起

6.接下来要根据另一个表来对上面的拼好的32位数据进行P盒置换,记为P(B),P盒见下图13,置换后的结果见下图14

图13 p盒 32位数据
图14 P(B)的结果,共32位

7.然后我们将P(B)跟L0(到目前为止L0一直未处理)进行异或得到新的R1,结果如下图15

图15 R1

8.最后求L1,L1就是R0,如下图16

图16 L1

这样完成了一轮DES加密

AES加密

AES使用有限域GF(28)内的算数,其中不可约多项式为:M(X)=x8+x4+x3+x+1,也就是二进制数00011011看a0到a7,尤其是分析a7情况
a7=0时,正常结果

a7=1时,结果需要异或00011011
注意,指的是左移之前的a7,如02·87=0000 0010 ·1000 0111=0000 1110(87左移一位),因为87的二进制a7为“1”,所以结果要异或 0001 1011 即 0000 1110 xor 0001 1011=0001 0101


AES的四个阶段:
1.字节替代:用s盒完成分组的字节到字节的代替
2.行位移:简单置换
3,列混淆:利用域上特性进行代替
4.轮密钥加:当前分组和扩展密钥的一部分进行按位异或

1.字节替代:根据给的s盒,从行列找出对应的值,注意x是行,y是列喔
2.行位移:第一行不动,第二行左移一位,第三行左移两位,第四行左移三位
3.列混淆:试图构造出带有02的,因为×02相当于左移一位,当移位前的最左边是1,也就是a7是1的时候,如上文所说要异或00011011
在列混淆中需要用到一个矩阵:
02 03 01 01
01 02 03 01
01 01 02 03
03 01 01 02
该矩阵是左边的,跟经过行位移后的矩阵进行乘法,即左边矩阵第一行乘右边矩阵第一列,再异或得到对应的数字,注意01乘啥是啥,02乘啥,啥就二进制左移一位。
4.轮密钥加变换

—-公钥密码—-

第九章:公钥密码学和RSA

RSA算法

C=Me mod n //加密
M=Cd mod n=(Me)d mod n=Med mod n //解密

RSA找到以下内容计算:
1.互素的两个整数 p、q //保密的,选定的
2.n=p×q //公开的,计算得出的
3.e 满足gcd(Ф(n),e)=1 //公开的选定的
4.d≡e-1 (mod Ф(n) ) //保密的,计算得出的
私钥{d,n},公钥{e,n}, Ф(n) =(p-1)(q-1)

第十章:密钥管理、其他密钥体制

Diffie-Hellman密钥交换

要定义离散对数,定义素数p的本原根a(就是信安数学的原根概念)

对于任意整数b和素数p的原根a,有:


算法:
素数q,他的原根α这两个整数是公开的。
当用户A与B要用该算法交换密钥,那么A要选择一个随机的整数Xa<q,计算Ya=αXa mod q,
B也要选择一个随机的整数Xb<q,计算Yb=αXb mod q。对于A要保护好自己的Xa,B要保护好Xb,通信的时候A和B可以交换Ya和Yb,接下来验证:
A计算K=(Yb)Xa mod q
B计算K=(Ya)Xb mod q
这两个算出来的K是一样的

EIGamal密码体制

同上一个算法一样,要选一个素数q,以及它的原根α(素根),用户A生成密钥对:
1.随机生成整数Xa,1<Xa<q-1
2.计算Ya=αXa mod q
3.A的私钥为Xa,公开的为{q,α,Ya}

用户B用用户A的公开信息对明文加密:
1.信息表示为一个整数M,使得1<=k<=q-1
2.随机选一个整数k,1<=k<=q-1
3.计算一次密钥K=(Ya)k mod q
4.把M加密成明文对(C1,C2),其中
C1=αk mod q C2=KM mod q

用户A解密:
1.计算K=(C1)Xa mod q //恢复密钥
2.计算M=(C2K-1) mod q //解密

第十一章:密码学hash函数

SHA-512

1.附加填充位
2.附加长度
3.初始化hash缓冲区
4.以1024位的分组(128字节)为单位处理信息
5.输出

示例:
对“abc”构成的消息块进行hash处理,可根据他们的ascii码写成二进制形式:
a:97(10) 0110 0001
b:98(10) 0110 0010
c:99(10) 0110 0011

所以“abc”一共有 24 位,二24对应的二进制为:1 1000

根据SHA算法,消息被填充后要跟1024模896同余,所以要填充长度为896-24=872位

填充的内容是 : 1个 “1” 和 871个 “0”

然后,把128位的长度信息附在填充消息的后面,表示保存的被填充之前的消息长度,在这里是24位,也就是1 1000(2)=18(16

因此,abc被扩充之后应该是如下:
0110 0001 0110 0010 0110 0011 | 1 0(*871) | 0(*123) 1 1000

前24位是abc的ascii码对应二进制,之后872位是1和871个0,最后的128位是若干个0(取决与原始长度)以及24对应的ascii码。一共1024位。

log4j2 远程代码执行

关注到最近出现了新的漏洞,看了一下网上别人的文章,学习一下

背景:apache log4j2时基于JAV的日志记录工具,它重写了log4j框架并加入了很多特性。许多业务系统使用该日志框架开发,存在有开发者记录用户输入导致的错误信息,这些信息会储存再日志。

【威胁等级】严重
【漏洞如何利用】:外部用户输入的数据被日志记录,造成远程代码执行。
【排查】:查看Java应用是否引入 log4j-apilog4j-core两个jar
【影响范围】:apache log4j2 2.0—-2.14.1版本
【应对方法】:升级到安全版本:log4j-2.15.0-rc1

看到“宽字节安全”相关的文章,引言的话让我印象深刻:
“一个称得上优秀的框架,必备的要素之一是可以通过某种约定的格式读取所运行环境中的配置信息”

学习安全,给我的感悟就是学的越多越觉得这个世界上没有安全一说,不管技术如何发展,“人”总会出现问题,在科技上“人”起决定性因素,首先我们使用的机器、技术都是人造的,计算机很聪明,能帮我们做到很多我们做不到的事,计算机也很笨,我们不进行设置它就什么都不知道。便利和安全是不可兼得的,我们为了便利统一了标准,这就让攻击者更有针对性的利用通用技术攻破大量资产,我们为了安全加上了访问控制,这就让我们打开手机打开应用都要先进行多步验证。这次这个漏洞出现在较新的框架中,可见,再新的技术还是得重视安全问题,勿给存坏心眼的人可乘之机。

log4j2 有一个lookup功能,为方便人调用,可以在任何位置使用约定格式获取环境中的指定配置信息。lookup可能会出现在不同的日志级别,下面是log4j2的8个日志等级:从低到高
all<trace<debug<info<warn<error<fatal<off
1.all:最低等级,打开所有的日志记录
2.trace:追踪,程序的推进
3.debug:指出细粒度信息事件(细粒度就是把复杂的东西拆成更细节的操作)
4.info:消息在粗粒度级别上突出强调应用程序的运行过程
5.warn:输出警告以及warn以下级别的日志
6.error:输出错误日志
7.fatal:输出每个严重的错误事件将会导致应用程序推出的日志

程序会打印高于或等于所设置级别的日志,设置的等级越高,打印出的日志越少。

不管什么级别都能触发lookup,有时候看不到是因为设置的日志等级过高。

查阅关于log4j2的一些文章:

1.log4j2 提供了许多方法获取所运行环境的配置信息
2.自定义lookup的时候,可以选择继承不同的类,如strlookup、abstractlooup等

之前ctf的部分crypto的wp

Writeup  sigma

Misc:签到题:与佛解码

Zip:图片一眼看长宽不太对,拉长图片看到^5 看到密文应该用这个当钥匙解开,到工具里试了出来

Web:目录:输入路径拿到

五子棋:下赢得

F09F9983F09F92B5F09F8CBFF09F8EA4F09F9AAAF09F8C8FF09F908EF09FA58BF09F9AABF09F9886F09F94AAE29883F09F9181F09F8E83F09F94AAF09F95B9F09F9AB0F09FA4A3F09F92A7F09F8EA4E29C96F09F8DB4F09F95B9F09F9191F09F94AAF09F8EA4F09F908EE29880F09F9983F09F9AA8F09F9181F09F8DB5F09F9189F09F8FB9F09F8EA4F09F9AB0F09F9882F09F988EF09F92B5F09F9887F09F9690F09F92A7F09F9983E29C89F09F9880F09F8F8EF09F988EF09F91A3F09F9881F09F988AF09FA693F09F9AABF09F988AF09F9983E29C89F09F9085F09F95B9F09F8CAAE29882F09FA58BF09FA693F09F8E85E29D93F09F8E88

“We got about more than 120 regular clients, and mainly 95 % of them are from the Canton Fair,” said Nick Koay, Chairman of Maycham China Greater Bay. He indicated that Canton Fair is a good platform and he hope to get more new customers from the domestic market.The 130th session of the China Import and Export Fair, also known as the Canton Fair, kicked off on October 14 in Guanghou, Guangdong. With the theme slogan “Canton Fair Global Share,” the fair is held in both offline and online forms and lasts five days to showcase 16 product categories across 51 exhibition areas.Nick Koay has participated the Canton Fair for 15 years. The products of his factory in Zhuhai are sold to about 30 countries in the world, and 95 % of his regular clients are from the fair. “gxuctf{D0_N0T_know_what_2_c}Canton Fair is one of the largest exhibitions in the world, and also, is a very good platform”, he said.Due to the COVID-19, many international buyers and exhibitors can’t join the fair on site, and the online provides them another platform. Nick Koay believed that it’s a kind of future business model. “We can be introduced to our new clients, and the online fair is quiet useful for our business.”In addition, Nick Koay was full of expectation about the 130th Canton Fair: “We are looking forward to having more domestic customers for expanding our business in the domestic market.

Selec题目:

二进制换十进制,发现有==结尾这个是base64,解码得出,看来罗马需要凯撒密码进行移位

最后进行替换密码的运算

aulqmcpthcpeuld! but rcwo zeledron pro koqellom ambgpuqmcgrb archholqo. romo ed c zhcq zum chh butm rcmn ozzumpd: qitapz{l0s_pr4pd_sr4p_e_a4hh_ambgp0}. but sehh zeln prcp c hup uz ambgpuqmcgrb ed jtdp ktehnelq uzz pred dump uz kcdea flushonqo, cln ep mochhb ed lup du kcn czpom chh. rugo but oljubon pro archholqo!

q i  t a p z h o c u m b        l   d   g r   e  s  w n k   j     f

g x u c t f  l  e a o  r  y        n    s  p  h  i w  v d  b  m  k

flag gxuctf{n0w_th4ts_wh4t_i_c4ll_crypt0}

鹦鹉学舌

密码给提示了,我猜是弱密码,暴力破解

成功

BABBAAABAAAAABAABBBAABBAAAABAABABBBAAAAABABBBAABBB

Gxuctf{wecomexaxh}

V:多表我猜是维吉尼亚,但没想到密码是维吉尼亚,密文给出来其实是几个按键围在一起中间的那个字母。。。

Gpcoiqkjonmnzxvnxugpmyw我猜可能又是要维吉尼亚来解开,提示给6位,又是多表,我猜是gxuctf