文档在自己的文件夹静静的躺了快半年了,好吧,先把应急响应流程步骤(乙方视角)和windows拆出来,在进行应急响应事件处置时需严格遵守公司的应急响应制度。

一、服务流程

沟通确认安全事件

在与客户第一次沟通时,应及时提醒客户对受害机器及时进行断网隔离操作。已知的安全事件包括但不限于如下:

1. 恶意代码威胁,即僵尸网络、恶意木马、蠕虫病毒、勒索病毒等恶意代码导致的安全事件

2. 高级持续性威胁(APT)攻击事件,即具有潜伏性、隐蔽性、目的性、持续性等特点的安全事件

3. 非法入侵事件,包括但不限于业务系统受到入侵致使数据泄露、丢失等;外网网站被入侵,导致网站被恶意篡改植入暗链或出现其他非法的宣传标语;服务器被入侵导致受到勒索攻击等安全事件

4. 漏洞事件,即0day公布;在野漏洞发现;已知漏洞被发现受到通报等安全事件

5. 数据泄露事件,即重要数据因受到了入侵导致的泄露;应用配置不当导致的泄露;员工误操作导致的泄露;内鬼泄露等安全事件

6. 分布式拒绝服务攻击(DDOS)事件,即网站受到了各类DOS攻击,包括但不限于CC攻击、洪水攻击、流量放大攻击等安全事件

7. 流量劫持,DNS劫持、HTTP劫持

8. 其他归于网络安全的事件

注意事项:一定要亲自确认,切不可盲目相信他人所述。

确认后,应尽量收集与本次安全事件相关的信息,例如什麽时候发现的攻击,之前有无出现过安全事件等。

在确认安全事件后明确应急目的:

1. 病毒、后门清除工作

2. 协助业务系统安全的恢复上线

3. 攻击溯源工作。(仅溯源至攻击者的攻击切入点)

现场保护

在与客户沟通时,应提醒客户注意保护现场,千万不要直接重装系统,以方便后续的溯源工作及可能存在的电子取证工作。在处置受害机器时,应尽量保持受害机器的原样,如虚拟机处置时,可以让客户进行快照存储。

了解客户网络状况

对客户的网络拓扑应尽早进行了解,特别是网络的进出口、负载均衡、防火墙、DNS服务器。

确定事件影响 确定工作方向 确立工作目标

明确现场工作任务归属

无论现场的环境,主导本次安全事件,合理分配现场工作为应急人员的必备技能。

对现场的可能存在的工作应具备清晰的认知。通常会存在以下工作内容:病毒分析处置、业务恢复、安全加固、溯源分析、临时需求处置、产品对接与使用、应急指挥与协调。

二、技术部分

1. 系统

1.1  Windows

1.1.1 熟悉现场环境

对受害机器进行了解,分析可能存在的共同弱点,进而提供溯源思路。

如:是否存在弱口令(例如3389、FTP、中间件、数据库)

是否存在对外映射的端口,或WEB应用等

1.1.2 账号安全风险分析

查看当前已登录的账号

query user

图片.png使用logoff ID 命令注销已登录用户,当可疑账号处于登录状态时,也可以使用mimikatz抓取密码。

图片.png

查看用户目录  是否存在新建用户目录

C:\Documents and Settings

C:\Users

查看对应用户的desktop与download目录下是否存在异常文件

图片.png图片.png

查看是否存在可疑账号、新增账号(注意Guest用户是否开启)

Win+R输入lusrmgr.msc     net user username查看详细

图片.png

查看是否存在隐藏账号、克隆账号

运行 — regedit.exe查看注册表

图片.png图片.png

或使用工具PC hunter与D盾进行排查

建立隐藏用户参考链接:

https://www.cnblogs.com/lunachy/p/4602228.html

1.1.3 日志风险分析

Win+R 输入 eventvwr.msc

打开事件查看器,注意日志事件是否存在缺失现象(日志出现断点或发现存在清除痕迹)

日志事件查看器本身支持筛选功能。也可以导出为CSV 或者TXT使用Excel或者Notepad进行分析

使用微软Log Parser进行分析(Log ParserUI封装了语句gui界面)

运行 — %UserProfile%\Recent,分析最近打开可疑文件,或根据最近修改时间进行排查

查看U盘使用痕迹,对比各时间点,排查可疑使用记录

//*注意采集日志时,应注意日志是否存在时间断点、或部分日志丢失情况

1.1.4 病毒风险排查

使用360杀毒离线版,并下载最新病毒库下载地址:http://sd.360.cn/download_center.html

使用其他杀软,并注意客户现场是否存在友商产品。

1.1.5 异常风险分析

1.1.5.1端口状态

cmd命令

netstat -ano

netstat -ano | findstr “port”查看端口对应的活动连接

tasklit | findstr “PID” 查看相应PID的进程

图片.png

TCP端口状态说明

图片.png

https://www.cnblogs.com/jessezeng/p/5617105.html

工具使用

PC Hunter、D盾

1.1.5.2进程

运行 — msinfo32 –软件环境–正在运行任务,查看详细

图片.png

运行 — taskmgr 任务管理器进行查看,可由进程打开相应文件位置,及相应服务。

排查可疑进程及子进程(多涉及感染型病毒)

观察内容包括:

没有签名验证信息的进程

没有描述信息的进程

属主异常的进程

路径不合法的进程

CPU或内存资源 长时间或过高占用的进程

存在异常活动连接的进程

工具使用:

PC Hunter、D盾、Process Explorer、Process Hacker、Autoruns

1.1.5.3启动项

注意当前系统时间是否有问题,病毒可能存在篡改系统时间,或利用系统时间异常的可能性。

单击–开始–所有程序–启动

图片.png

输入命令查看启动项wmic startup list full

运行 – 输入msconfig查看是否存在可疑的启动项目

图片.png

打开注册表,查看是否存在可疑开机启动项,特别注意如下三个注册表项:

HKEY_CURRENT_USER\software\micorsoft\windows\currentversion\run

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Runonce

图片.png

运行 — gpedit.msc组策略中查看启动

工具使用:

Autoruns、PC Hunter、360安全卫士

1.1.5.4计划任务

控制面板 — 管理工具 — 任务计划程序

或运行 — taskschd.msc

通过命令查看计划任务schtasks /query /fo table /v

图片.png图片.png

或者注册表下手动排查(其使用了XML格式,若出现特殊字符,可导致打开报错)

HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ Schedule \ TaskCache \ Tree

图片.png

运行 — 管理员运行cmd — at 检查计算机与网络上其他计算机之间的会话或者计划任务,如有确认是否为正常连接。

1.1.5.5系统服务

运行 — services.msc 注意服务状态和启动类型,检查是否存在可疑服务。

运行 — taskmgr 任务管理器内查看服务

工具使用:

PC Hunter

1.1.6 系统风险分析

1.1.6.1 系统后门排查

对当前操作系统版本、操作系统补丁、应用版本进行确认,分析可能存在的威胁因素。

如“永恒之蓝”漏洞未打补丁,是否存在利用痕迹。

IIS低版本漏洞。

检查方法:

1. 运行 — systeminfo查看系统信息

2. Shift后门排查使用OD 分析C:\WINDOWS\system32\dllcache\sethc.exe

3. 对于一些windows常见的持久化痕迹基本都很明显,如有需要可以参考

https://www.freebuf.com/vuls/195906.html

1.1.6.2 敏感目录排查

可能存在问题的敏感目录

   %WINDIR%

%WINDIR%\system32%TEMP%

%LOCALAPPDATA%

%APPDATA% 各盘下的tmp缓存目录,例如C:\Windows\Temp

1.1.7 综合分析得出结论

1. 系统漏洞直接造成的入侵事件。如“永恒之蓝”、弱口令

2. 系统漏洞间接造成的入侵事件。如WebShell后,本地提权。

3. 应用漏洞直接或间接造成的入侵事件。如Struts 2远程命令执行、WebLogic弱口令或远程代码执行、IIS PUT上传漏洞、FTP弱口令或溢出攻击等。

*本文作者:PinkWolf,转载请注明来自FreeBuf.COM

有些时候二维码被严重破坏导致无法扫描,促使我去学习了一波关于二维码的知识。二维码一共有40个尺寸。V 1是21 x 21的矩阵,V2是 25 x 25的矩阵,V3是29的尺寸,每增加一个等级,就会增加4的尺寸,公式是:(V-1)*4 + 21 最高V 40,(40-1)*4+21 = 177,所以最高是177 x 177 的正方形。

二维码格式示例如下:跟我一起学习玩转二维码

定位图案

定位图案,就是每个二维码都有的左上、左下和右上三个角的“回”字形的标志。用于标记二维码的矩形大小他的尺寸都是7*7的模块。

跟我一起学习玩转二维码功能性数据:存在于所有的尺寸中,用于存放一些格式化数据的,主要内容为“纠错码等级(3bit)+掩码类别(2bit)+BCH code(10bit,用于纠错)”,然后这15个bits还要与101010000010010做XOR操作,主要是为了如果选用了00的纠错级别和000的Mask,从而造成全部为白色,这会增加扫描器的图像识别的困难。比如:

跟我一起学习玩转二维码  而这15个bit在format information区域内的分布如下:

跟我一起学习玩转二维码  在 Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。

 数据码和纠错码

 除了上述的那些地方,剩下的地方存放 数据码 和纠错码。就是最前面两张图的深灰色区域,一般数据都是从右下角开始填充,先填充数据码,数据码填充完毕之后再填充纠错码,以v1为例,数据的填充顺序,是这样的:


跟我一起学习玩转二维码

数据编码

QR码支持如下的编码:

数字编码:从0到9;

字符编码:包括 0-9,大写的A到Z(没有小写),以及符号$ % * + – . / : 包括空格;

字节编码:可以是0-255的ISO-8859-1字符;

日文编码:也是双字节编码;

Extended ChannelInterpretation (ECI) mode 主要用于特殊的字符集。并不是所有的扫描器都支持这种编码;

Structured Appendmode 用于混合编码,也就是说,这个二维码中包含了多种编码格式;

FNC1 mode 这种编码方式主要是给一些特殊的工业或行业用的。比如GS1条形码之类的

下表是每个模式的编码相对应的“编号”,这个编号,存在于format information区域。

跟我一起学习玩转二维码

因为种类较多较复杂,而且为了方便大家理解,我们在这里值选择数字编码和字符编码举例,其它的编码,有兴趣的同学可以查看官方文档。
示例一:

数字编码,从0到9。如果需要编码的数字的个数不是3的倍数,那么,最后剩下的1或2位数会被转成4或7bits,则其它的每3位数字会被编成10位的二进制数,最后将这些二进制数据连接起来并在前面加上编码模式的编号和字符计数指示符(就是表示了被编码的信息有多少个字符),字符计数指示符的长度取决于编码的模式和所要编成二维码的版本,在数字编码中,字符计数指示符如下表对应的有10、12或14位:

跟我一起学习玩转二维码

比如在Version 1的尺寸下,纠错级别为H(纠错级别我们会在下面讲到)的情况下,我们要编码: 01234567

(1)把上述数字分成三组: 012 345 67

(2)把他们转成10bit二进制:  012 转成 0000001100;345 转成 0101011001;67 转成1000011。

(3)把这三个二进制串起来: 0000001100 0101011001 1000011

(4)把数字的个数转成二进制 (version 1-H是10 bits ): 8个数字的二进制是0000001000

(5)把数字编码的标志0001和第4步的编码加到前面:  0001 00000010000000001100 0101011001 1000011

示例二:

字符编码(也叫字母数字编码)。包括 0-9,大写的A到Z(没有小写),以及符号$ % *+ – . / : 包括空格。这些字符会映射成一个字符索引表。如下所示(两个表,中英文对照):(其中的SP是空格,Char是字符,Value是其索引值),编码的过程是把字符两两分组,然后转成下表的45进制,然后转成11bits的二进制,如果最后有一个落单的,那就转成6bits的二进制。而字符计数指示符需要根据不同的Version尺寸编成9, 11或13个二进制(如上表)。

跟我一起学习玩转二维码image.png

在V 1的尺寸下,纠错级别为H的情况下,编码: AC-42

(1)从字符索引表中找到 AC-42 这五个字条的索引 (10,12,41,4,2)

(2)两两分组: (10,12) (41,4) (2)

(3)把每一组转成11bits的二进制:(10,12) 10*45+12 = 462 转成 00111001110;(41,4)41*45+4 = 1849 转成 11100111001;

(4)把这些二进制连接起来:00111001110 11100111001 000010

(5)把字符的个数转成二进制 (Version 1-H为9 bits ): 5个字符,5转成 000000101

(6)在头上加上编码标识 0010 和第5步的个数编码:  0010 00000010100111001110 11100111001 000010

结束符和补齐符

以上述示例一为基础,在编码结束后,我们得到了如下编码:

然后,我们还要加上结束符,表示真正的额数据已经结束。

编码 字符数 HELLO WORLD的编码
0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101

我们还要加上结束符:

编码 字符数 HELLO WORLD的编码 结束
0010 000001011 01100001011 01111000110 10001011100 10110111000 10011010100 001101 0000

按每组8个bit分组,如果所有的编码加起来不是8个倍数我们还要在后面加上足够的0,比如上面一共有45个bit,所以,我们还要加上3个0,然后按8个bits分好组:0001000000100000 00001100 01010110 01100001 10000000

接着就是补齐符,如果还没有达到我们最大的bits数的限制,我们还要加一些补齐码就是重复下面的两个bytes:11101100 00010001。(使用这两个字节的主要原因是,为了防止在填入数据时出现大片的深色或浅色区域,对扫描器产生干扰,使得二维码难以正常扫描),至于要补多少个补齐符,需要查看文档中相应的字符数和数据容量对应表,在官方文档中,相对应的是表7-表11

跟我一起学习玩转二维码

从表中,我们可以知道,v1-H的数据容量为9个数据码字(每个数据码字为8位),而我们上面已经有了6个数据码字,所以要补充三个8bit,补充完毕如下:0001000000100000 0000110001010110 01100001 10000000 11101100 00010001 11101100 上面的每一组数据为一个数据码字,Data Codewords,现在也只是原始数据,还需要对其加上纠错码。

纠错码

上面我们提到了纠错级别,二维码中有四种级别的纠错(从低到高为L、M、Q、H),这就是为什么有人在二维码的中心位置加入图标,也依旧能够扫描(就是二维码残缺量不超过所对应的纠错等级能允许的范围时,使用扫描工具依旧能扫描出内容的原因)。

image.png

至于纠错码是如何计算的,这涉及到里德-所罗门纠错算法,里德-所罗门码是定长码。这个比较复杂,但是万能的Pythom里面有一个交reedsolo的库可以直接调用。这意味着一个固定长度输入的数据将被处理成一个固定长度的输出数据。在最常用的(255,223)里所码中,223个里德-所罗门输入符号(每个符号有8个 位元)被编码成255个输出符号。大多数里所错误校正编码流程是成体系的。这意味着输出的码字中有一部分包含着输入数据的原始形式。符号大小为8位元的里所码迫使码长(编码长度)最长为255个符号。标准的(255,223)里所码可以在每个码字中校正最多16个里所符号的错误。由于每个符号事实上是8个位元,这意味着这个码可以校正最多16个短爆发性错误。里德-所罗门码,如同卷积码一样,是一种透明码。这代表如果信道符号在队列的某些地方被反转,解码器一样可以工作。解码结果将是原始数据的补充。但是,里所码在缩短后会失去透明性。在缩短了的码中,“丢失”的比特需要被0或者1替代,这由数据是否需要补足而决定。(如果符号这时候反转,替代的0需要变成1)。这样就需要在里所解码前对数据进行强制性的侦测决定。

我们有现成的python模块来运算出纠错码——python的reedsolo模块。我们可以对照官方文档中的纠错特性表。以下表为例:

跟我一起学习玩转二维码

以版本1-H为例进行解释,从表中,我们可以清晰的知道,纠错码字数应该为17个,纠错的块数为1(表示这个版本要编码的数据只会分为一个数据块),(26,9,8)表示,这个版本的二维码总共可以存放26个码字,但是这26个码字中,有9个码字为数据码字,17个为纠错码字(8*2+1=17),8位纠错容量。每个表的下方否有注释信息:

跟我一起学习玩转二维码

这也是为什么纠错码字数为r*2,当后面有一个箭头时,表示r*2之后还要加1。在给数据码字添加纠错码时,还有对数据码字分块的操作,因为version1的二维码对数据码字之分一个块,不够明显,所以我们采用网上的一个例子:

跟我一起学习玩转二维码上述的Version 5 + Q纠错级:需要4个块(2个块为一组,共两组),头一组的两个Blocks中各15个字节(数据码字)数据 加上 各 9个字节的纠错容量(18个字节的纠错码字)。因为二进制写起来会让表格太大,所以,都用了十进制来表示,我们可以看到每一个数据块的纠错码有18个字节,也就是18个8bits的二进制数。

跟我一起学习玩转二维码

5.   最终编码,穿插放置。

此时,编码的过程,只剩下最后一步。

对于数据码字:把每个块的第一个codewords先拿出来按顺度排列好,然后再取第一块的第二个,如此类推。上述示例中的Data Codewords如下:

跟我一起学习玩转二维码

我们先取第一列的:67 246 182 70

然后再取第二列的:67 246 182 70 85246 230 247

如此类推:67 246 182 70 85246 230 247 ………  ……… 38 65017 7236

对于纠错码,也是一样:

跟我一起学习玩转二维码

和数据码取的一样,得到:213,87,148,235,199,204,116,159,…… …… 39,133,141,236

然后,再把这两组放在一起(纠错码放在数据码之后)得到:

67, 246, 182, 70, 85, 246, 230, 247, 70, 66, 247, 118, 134, 7, 119, 86, 87,118, 50, 194, 38, 134, 7, 6, 85, 242, 118, 151, 194, 7, 134, 50, 119, 38, 87,16, 50, 86, 38, 236, 6, 22, 82, 17, 18, 198, 6, 236, 6, 199, 134, 17, 103, 146,151, 236, 38, 6, 50, 17, 7, 236, 213, 87, 148, 235, 199, 204, 116, 159, 11, 96,177, 5, 45, 60, 212, 173, 115, 202, 76, 24, 247, 182, 133, 147, 241, 124, 75,59, 223, 157, 242, 33, 229, 200, 238, 106, 248, 134, 76, 40, 154, 27, 195, 255,117, 129, 230, 172, 154, 209, 189, 82, 111, 17, 10, 2, 86, 163, 108, 131, 161,163, 240, 32, 111, 120, 192, 178, 39, 133, 141, 236

剩余位

最后再加上Reminder Bits,对于某些Version的QR,上面的还不够长度,还要加上Remainder Bits,比如:上述的5Q版的二维码,还要加上7个bits,Remainder Bits加零就好了。关于哪些Version需要多少个Remainder bit,可以参看官方文档的表一(这里列出一部分)。

跟我一起学习玩转二维码

掩码(也叫掩模)

编码的步骤是完成了,但是要想生成一个完好的二维码,还需要先将现在所拥有的数据填入提前准备的空白模板后,选择一个合适的掩码,将原模板的数据与掩码进行异或运算,最后,再将format information填进去就生成了二维码。掩码存在的意义:二维码是要拿来扫描的,而扫描怕的就是无法清晰地分辨出编码信息的每一位。要是二维码中黑白点数量不均,或是空间分布不均都会导致大色块区域的出现,而大色块区域的出现会增加扫描时定位的难度,从而降低扫描的效率。更严重的情况下,如果数据填入后碰巧出现了功能性标识,比如定位标识的图样,还会干扰正常功能性标识的作用,导致QR码无法扫描。在计算机科学中,掩码就是一个二进制串,通过和数据进行异或运算来变换数据。在QR码中,掩码也是通过异或运算来变换数据矩阵。所以你可能已经猜到了,QR码的掩码就是预先定义好的矩阵。QR标准通过生成规则定义了八个数据掩码:

跟我一起学习玩转二维码前面的三位二进制的数据就是每个模式掩码相对应的编号,这个信息也是要填入format information中的。

跟我一起学习玩转二维码从这个图我们就可以直观的看到每种掩码的模板样子,以掩码2(编号为010)为例,j mod 3 = 0 就是表示从左变开始数,能被3整除的列,都要取逆(黑块变白块,白块变黑块),当然二维码的固定格式区域的信息时不用取逆的,所以要使用掩码2,需要取逆的列数为:0、3、6、9…..。

跟我一起学习玩转二维码当然,官方规定在进行异或时,原始的数据模板要与每个掩码模板进行异或运算后,要进行如下的规则进行计分(处罚),最后选择分数最低的一个作为最佳的掩码选择。

跟我一起学习玩转二维码

另外,使用python的reedsolo模块,能够在二维码损坏超出相应级别的容错范围时也能够恢复数据。

Python2环境下的reedsolo模块基本使用方式

1. 首先安装reedsolo模块,python官方下载的reedsolo模块版本为0.3,不是很好用,这次使用的reedsolo模块存放在下载包中的reedsolomon-master.zip,解压后在该路径下运行cmd命令python setup.py install即可。

跟我一起学习玩转二维码2.     进入python环境,导入reedsolo模块。定义一个对象,设置生成的纠错码个数为10个。

跟我一起学习玩转二维码3.    为字符串“hello world”编码,生成纠错码。

跟我一起学习玩转二维码

4.   进行解码

跟我一起学习玩转二维码5.    现在大致了解了reedsolo模块的使用方法,那现在了解一下纠错码的作用,比如,我们现在将“hello world”写成错误的“hellx xorld”,这里我们出现了两个错误,配上之前生成的纠错码进行解码,输出的就是正确的字符串,纠错码就是这样了。

跟我一起学习玩转二维码6.    纠错码算法是对所要纠错的内容一个字节一个字节地进行编码,所以编码后生成的是一个字节数组。

7.   将编码后的内容转化为十进制输出

跟我一起学习玩转二维码

学以致用,复现MMA2015-MISC400-qr的二维码恢复挑战的解题步骤,原版write-up地址为:https://github.com/pwning/public-writeup/blob/master/mma2015/misc400-qr/writeup.md

1.   题目给出的二维码如下图

跟我一起学习玩转二维码

这是一个25*25的二维码,也就是version2的二维码,二位从它能看见的部分我们可以得到format information的一部分信息:??????011011010

2.   对照下面这个网址所给出的对应表,可以知道这个二维码使用了什么编码模式和使用了哪一个掩码

https://www.thonky.com/qr-code-tutorial/format-version-tables#list-of-all-format-information-strings

跟我一起学习玩转二维码

经对照可知,完整的format information信息应该是:010111011011010。且可以得到的信息还有该二维码使用的掩码为6,所对应的纠错等级为Q。

3.   将被遮挡的固定信息部分以及format information信息补充完整。

跟我一起学习玩转二维码  与相对应的掩码进行异或运算,得到原始的数据中的一部分数据码字和纠错码字。下图就是掩码6相对应的图案。

跟我一起学习玩转二维码4.    将掩码应用到我们补充完的二维码上,翻转与掩码中深色区域相对应的区域的颜色,并用灰色将format information覆盖,方便读取数据,如下图。

跟我一起学习玩转二维码

5.   从右下角开始,按下图的蛇形顺序读取数据码字和纠错码字的信息,至于不同区域块的信息读取顺序,可以参考官方文档。

跟我一起学习玩转二维码跟我一起学习玩转二维码

跟我一起学习玩转二维码且相对应的数据块分布应该如下图所示:

跟我一起学习玩转二维码

6.   将全部可读的信息读取出来:      

跟我一起学习玩转二维码

7. 根据官方文档的纠错特性表,可知version2-Q的纠错码字数有22个,数据码字数也有22个,在Q级别,它可以恢复不超过25%的损坏的字节,但是我们只有16个完整的字节,即超过63%的字节丢失,仔细查看Reed-Solomon的纠错能力,并意识到它可以纠正多达两倍的擦除——也就是说,如果 它知道错误在哪里,那么纠错能力就强得多。这意味着我们的代码可以从丢失的字节的50%恢复过来!但这意味着我们只能纠正多达22个丢失的字节,但是我们目前依然只有16个完整的字节,所以我们要想办法恢复一部分字节使得达到22个字节这个最低要求。

跟我一起学习玩转二维码

8.   我们先将获得的可读取数据整理一下:

     0010:【编码模式=字符编码(字母数字模式)】

     000010100:【9个bit长度的字符计数标识符=20个字符】

     01010111000:【FL】

     00111010010:【AG】

     11001100110:【 I】

     1010001000?:【S?】

我们计算一下,22个数据码字,就是176个bit,而20个字符,在编码的时候分为10组,每组11个bit,所以4+9+10*11=123个bit,123/8=15余3,再加上4个0(结束符) ,以及8bit重组时需要补充为8的倍数,8-3-4=1,所以还需要加1个0。这时候总共也就16个数据码字,22-16=6,所以还要加上6个 字节的补齐码,如下(红色的是原本被遮住的数据):

00100000 10100010 10111000 00111010 01011001 10011010 10001000 ???????????????? ???????? ???????? ???????? ???????? ???????? ???????? ??000000     1110110000010001 11101100 00010001  11101100  00010001

这样,我们就回复了6个字节的数据,此时我们丢失的字节就只剩下22个了,正好达到了最低的要求。我们就可以使用纠错码恢复原本的数据。

9.   编写脚本利用python的reedsolo模块进行纠错。

跟我一起学习玩转二维码

10.   得到全部的信息。

跟我一起学习玩转二维码

11. 拆分和解码

跟我一起学习玩转二维码参考文献

https://zhuanlan.zhihu.com/p/21463650     

https://coolshell.cn/articles/10590.html

2.官方文档(中文版):

https://wenku.baidu.com/view/ef77275f312b3169a451a4a4.html?pn=50

3.里德-所罗门码:

https://www.jianshu.com/p/8208aad537bb    

https://en.wikiversity.org/wiki/Reed%E2%80%93Solomon_codes_for_coders#Encoding_outline

https://stackoverflow.com/questions/30363903/optimizing-a-reed-solomon-encoder-polynomial-division

4.MMA2015-MISC400-qr的write up:

https://github.com/pwning/public-writeup/blob/master/mma2015/misc400-qr/writeup.md

*本文作者

最近瞅着测APP的空档,翻了翻之前买的一本讲Android安全的书,书快要翻完了,但是里面还有实际操作的部分,书里面提到的工具跟目前用到的有一些出入,借着google总算把最简单的一部分搞定了,做个记录~

操作系统:win10

先从一个很简单的apk包入手,一个假登录页面:

页面1.png点击登录的时候弹出提示:页面2.png

代码用得是Android Studio3.5的版本,Android Studio的版本更新后,代码的书写方式也跟以前不一样了:代码.png

主页面完成后,打包成apk文件,这里我试了三种打包方式,结果都是一样的:

未签名打包:

打包1.png

V1方式签名的正式包:

打包2.png打包2-1.png

V2方式签名的正式包:打包3.png

打包完成后,找到apk包文件,打包成功.png

使用apktool直接反编译:反编译.png

.\apktool.bat d -f .\app-release.apk -o test

解释:

d表示decode,意思是反编译,与之对应的是b ,building,编译

-f 表示force,强制删除目标目录

-o 表示输出地址

反编译后进入到test文件夹下的/smali/com/example/hellosmali中,可以看到有两个MainActivity的smali文件:反编译结果.png

其中MainActivity$onCreate$1.smali文件中有我们希望修改的onclick操作:

反编译代码.png

修改const-string v1值为:hello smali

反编译后修改代码.png

这里修改完成后需要重新回编译为apk包,书上说的是用Android逆向助手,但是我试过后并没有打包成功:Android逆向助手.png

apktool也可以进行回编译:apktool打包报错.png

这里报错了,因为高版本的Android Studio和Gradle使用了aapt2打包apk,但是apktool却是使用的aapt1打包。按照网上教的办法在gradle.properties文件添加了android.enableAapt2=false:禁用aapt2.png

重新编译apk包,继续报错:还是打包报错.png

这里点报错信息后定位到了minSdkVersion,我还以为是最低版本的问题,改为20后,还是报错……

想了想,又将apktool升级到了最新版本,重新回编译,还是报错,但是错误提示已经跟之前不一样了:重新回编译.png

删除了报错的xml文件后,又继续提示其他文件报错T_T……

本来打算下个3.0以下版本的android studio再重新打包个apk,不过后来在网上看到一个回答说可以把C:\Users\XX\AppData\Local\apktool\framework\1.apk删掉试试,抱着试试的心态删掉了1.apk,再重新回编译:

.\apktool.bat b .\test\

回编译成功.png

看着成功了,去dist目录下看果然有了新包:有了新包.png

将新打的包安装到Android机上,又报错:未签名报错.png

NO_CERTIFICATES,没有签名,不能安装,那就先给apk包签个名好了,用得是jdk自带的keytool和jarsigner工具。

使用keytool工具先生成签名文件:keytool位置.png生成签名文件.png

.\keytool.exe -genkey -alias “test” -keyalg “RSA”

解释:

-genkey 创建新密钥

-alias 密钥别名

-keyalg 生成密钥对的算法

-validity ,后面跟天数,代表创建的证书有效期,也可默认

再使用jarsigner工具进行签名:jarsigner工具.pngjarsigner成功.png

.\jarsigner.exe -verbose -keystore C:\

Users\xxx\.keystore -signedjar C:\Users\xxx\app-debug-signed.apk C:\Users\xxx\app-debug.apk “test”

解释:

-verbose  签名/验证时输出详细信息

-keystore  密钥库位置

-signedjar 已签名的jar文件的名称

注意最后跟的是别名(alias),写错了会报错的:jarsigner报错.png

最后终于生成了一个签名包:签名包生成.png

再次安装:已存在报错.png

提示已经存在这个包了,删除手机上的原来的app,重新安装,成功:再安装成功.png

再点击登录按钮时,可以看到提示语已经被修改过了:

更改登录.png后记:

这是Android静态分析的开始,入门级的入门级,虽然简单,但是对于我这种菜鸟级的还是有不少的坑,看到预期的结果出现后还是有那么一丢丢成就感的^_^

*本文作者:梦里不知哪儿是哪儿,转载请注明来自FreeBuf.COM

近日油管上出现大量关于“比特币生成器”的广告宣传视频,号称该工具可为用户免费生成比特币,实际上却是一个散布Qulab信息窃取和剪贴板劫持木马的恶意行为。

youtube-rectangle_headpic.jpg

该活动由安全研究员Frost发现,他表示已对此木马行为追踪了15天左右,每次发现类似视频并上报的时候,YouTube都会很快将视频删除并封禁相应用户,但治标不治本,很快又会有新的账户出现上传类似视频。

videos.jpg

视频上传者

视频的内容是介绍一个号称可以免费生成比特币的工具,并附带下载链接,该工具实际上是一个木马程序,以及一个https://freebitco.in网站的链接。如图:

youtube-videos.jpg木马宣传视频

当用户点击视频中的下载链接时,会跳转到一个Setup.exe文件的下载页面。如果用户下载并运行该文件,则计算机内将会被植入Qulab木马。

setup-download.jpg

程序下载页面

Qulab木马

这个YouTube骗局中推送的恶意程序是Qulab信息窃取和剪贴板劫持木马。程序执行后,木马会将自身复制到%AppData%\amd64_microsoft-windows-netio-infrastructure\msaudite.module.exe这个位置并启动。

根据Fulaik0关于Qulab上的文章可以了解到,Qulab木马会窃取用户浏览器历史记录、保存浏览器凭据、cookie,以及FileZilla、Discord和Steam中保存到凭据。该木马还会从计算机中窃取.txt、.maFile和.wallet文件。

除此之外,QUlab还会成为剪贴板劫持程序或限幅器,也就是说它可以监控Windows剪贴板中出现的数据,并且在检测到数据时,还能将其与攻击者想要的不同数据做出交换。在当前的攻击场景中,Qulab会寻找已经复制到剪贴板中的加密货币地址,并将其交换出来。

由于加密货币的地址是长字符串并且难以口头记忆,所以很多用户都不会发觉他们所记录的地址已经被悄悄的换成了别的内容,攻击者可以通过这种方式大肆窃取加密货币。

Fumik0_的分析表明Qulab支持以下Clipper组件的加密货币地址:

image.png

在编译被盗数据时,木马程序会通过Telegram将其发送给攻击者,如下所示:

network-traffic-r.jpg

如果不幸感染了该木马,请立即更改常用账户以及网站的密码。再次建议,请尝试使用密码管理器为每个账户创建唯一且强大的密码。 

*参考来源:bleepingcomputer,Karunesh91编译,转载请注明来自FreeBuf.COM

各位Buffer早上好,今天是2019年5月31日星期五。今天的早餐铺内容主要有:未修复的漏洞将影响所有Docker版本;YouTube上出现大量与加密货币有关的视频,实为加速木马传播;缤客网订酒店被退单,信用卡遭多个国家国际盗;广东:校园学习类App不得随意征集学生家长信息;OnePlus 7 Pro指纹识别系统在五分钟内即可破解。

安全资讯早知道,三分钟听完最新安全快讯~

build-your-own-grand-slam_thumbnaillarge_2017-04-05-17-33-50.jpg

未修复的漏洞将影响所有Docker版本

所有版本的Docker目前都容易受到“竞态条件”的攻击,这种攻击手段可使攻击者对主机系统上的任何文件都具有读写访问权限,概念验证代码已经发布。该漏洞类似于CVE-2018-15664,它为黑客提供了一个窗口,可以指定的程序开始对资源进行操作之前修改资源路径,归属于时间检查(TOCTOU)类型的错误。

该漏洞的核心源于FollowSymlinkInScope功能,该功能易受TOCTOU攻击。该函数的目的是通过将进程视为Docker容器组件来以安全的方式解析指定的路径。解释路径的操作不会立即进行,它会“稍微延时后完成”。攻击者可以通过这个时间差修改路径,该路径最终会以root权限进行相关操作。[来源:bleepingcomputer]

YouTube上出现大量与加密货币有关的视频,实为加速木马传播

YouTube上正在进行诈骗和恶意软件宣传活动,该宣传活动使用视频宣传“比特币生成器”工具,该工具有望为其用户生成免费比特币。实际上,这个骗局正在推动Qulab信息窃取和剪贴板劫持木马的传播。

安全研究员发现此类视频后即会向YouTube报告,然后YouTube都会将其删除,但攻击者只要再创建一个新用户即可上传更多恶意内容。在视频中出现的“免费比特币获取工具”实际上是一个特洛伊木马。[来源:bleepingcomputer]

缤客网订酒店被退单,信用卡遭多个国家国际盗刷

Booking是总部位于荷兰的住宿预订平台,在国内被网友称作“缤客”。住在西安的赵女士说,她从2014年起就开始在缤客网上预订酒店。赵女士在缤客网上订酒店,遭遇酒店退单之后,没有索回应退款项,且此后信用卡遭遇多个国家的国际盗刷。对此,缤客网公关回应称,接到投诉后,正在帮助游客赵女士处理此事。

缤客网在酒店预订的过程中是不需要提供密码的,输入银行卡信息后,银行卡的相关信息会直接发给酒店,所以最后出现卡被盗刷的现象。赵女士说,她对缤客网目前的处理态度难以接受。“我把钱支付到你的账号里,现在酒店退单,理应先把我的钱退还给我。”对于赵女士所说的情况,5月28日下午,缤客网的公关人员回应称,对于订酒店的退款以及银行卡被人盗刷一事,接到赵女士的反馈之后,已经由缤客网负责客户服务的相关工作人员跟进处理此事,后续如有进展,会第一时间进行反馈。[来源:cnbeta]

广东:校园学习类App不得随意征集学生家长信息

中共广东省委教育工作委员会等7部门宣布,《广东省面向中小学生校园学习类App管理暂行办法》(以下简称管理办法)正式出台,旨在治理学习类App存在的诸多问题,进一步规范校园学习类App使用。

早在今年3月,广东省教育厅曾发布《管理办法》的征求意见稿。据悉,《管理办法》是国内首个针对校园学习类App的省级实施细则,共15条,明确了适用对象、管理范围、部门分工、主办者及产品要求、审查办法、监管机制等内容,自2019年6月1日起正式实施。[来源:IT之家]

OnePlus 7 Pro指纹识别系统在五分钟内即可破解

OnePlus 7 Pro的指纹识别功能采用了和OnePlus 6T相同的“屏下光学”技术,就准确性和解锁速度而言,其表现的确十分出色。但是,对于Max Tech来说“骗过”这些传感器其实并不困难。据Forbes报道,Chaos计算机俱乐部(CCC)在2013年成功绕过了iPhone5S Touch ID的指纹识别系统。他们使用厚的调色剂激光打印到透明薄片上,用乳胶覆盖制成假指纹。

相比之下,Max Tech采取的方法更简单,他将一小块热胶粘到一些锡箔上,润湿手指并将其轻轻涂抹在胶水上以留下印痕,然后用一些白色的胶水填充顶部。只要白胶干燥,即可将其小心地剥离,露出可以用来成功立即解锁OnePlus 7 Pro的假指纹。Max Tech称,克隆的指纹同样可以打开OnePlus 6T,但这种把戏对于使用超声波生物识别技术的手机来说完全无效。[来源:cnbeta]

今天给大家介绍的这款开源工具名叫AutoSource,它是一款整合了SonarQube的自动化源代码审计框架。

AutoSource :整合SonarQube的自动化源代码审计框架

AutoSource

AutoSource是一款整合了SonarQube的自动化源代码审计框架,广大研究人员可以利用该工具来进行静态代码分析与审计。除此之外,在AutoSource的帮助下,我们还可以在SDLC(软件开发生命周期)的各个阶段中对目标项目进行高效率的漏洞扫描。代码扫描的过程也非常简单,我们只需要将给定的GIT代码库链接到框架中,AutoSource就可以完成剩下的自动化扫描任务了。

AutoSource框架目前支持在大部分常见计算机平台上执行源代码审计,其中包括macOS、Linux和Windows。

工具安装

1、 使用下列命令将AutoSource框架代码库克隆到本地设备:

git clone https://github.com/Securityautomation/autoSource.git

2、 读取prerequisites.txt文件,并安装所有框架依赖组件。

3、 运行downloadSonar.py文件,该文件将下载并安装SonarQube框架,安装完成后可以直接在浏览器地址栏中输入“http://127.0.0.1:9000“来访问工具:

python3 downloadSonar.py

4、 接下来,运行executeScanner.py文件,该文将会要求你输入需要扫描的GIT代码库地址:

python3 executeScanner.py

5、 扫描完成后,可以直接访问下列地址来查看SonarQube界面:

http://127.0.0.1:9000

工具运行截图

下载SonarQube和SonarScanner:

AutoSource :整合SonarQube的自动化源代码审计框架

SonarQube运行:

AutoSource :整合SonarQube的自动化源代码审计框架

运行扫描器:

AutoSource :整合SonarQube的自动化源代码审计框架

自动化扫描过程:

AutoSource :整合SonarQube的自动化源代码审计框架

扫描成功:

AutoSource :整合SonarQube的自动化源代码审计框架

SonarQube仪表盘:

AutoSource :整合SonarQube的自动化源代码审计框架

项目地址

AutoSource:【GitHub传送门

* 参考来源:Securityautomation,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

概述

通过开源软件可以构建一个安全应急响应平台,该平台可以进行日志整合、告警生成、IoC 丰富与事件管理。

在上面的流程图中,作为 HIDS 的 Wazuh 将数据发送回 Wazuh Manager 与 Elasticsearch。ElastAlert 观测到新事件并在 TheHive 中相应生成告警。然后通过 Cortex 与 MISP 查询额外信息丰富该事件,之后自动关闭该事件或提交给分析师。

请注意,系统中的任何端点服务或者可以生成日志传送给 Elasticsearch 的 Agent 都可以被替代。该套系统的好处在于绝大多数的组件都可以替换。

Wazuh

Wazuh 是一个开源安全监控解决方案,用于收集、分析主机安全数据。Wazuh 是 OSSEC 项目的分支。Wazuh 组件与 Elasticsearch 和 Kibana 的整合度很高,可以用来执行许多与安全相关的任务,如日志分析、Rootkit 检测、监听端口检测、文件完整性检测等。

Elasticsearch

Elasticsearch 将充当整个系统的日志存储库。Elasticsearch 非常强大,具备很多功能。常与 Logstash(日志收集)和 Kibana(可视化)结合使用。Elasticsearch 为所有类型的数据存储都提供了一个强大的平台。

ElastAlert

ElastAlert 是由 Yelp 发起的项目,为 Elasticsearch 提供告警机制。ElastAlert 通过 REST API 查询 Elasticsearch 并有多个输出来匹配告警。

TheHive

TheHive 是一个可扩展的、开源、免费安全应急响应平台,旨在让任何安全从业人员能够轻松地处理安全事件,并快速地采取行动。本质上讲 TheHive 是一个告警管理平台,用于管理全部事件告警。

Cortex

Cortex 与 TheHive 是一个团队开发的产品。Cortex 使用分析器获取日志中有关指标信息的其他数据。允许在第三方服务中查询 IP、URL 与文件哈希等指标,并将第三方返回的结果作为附加信息丰富告警事件。

MISP

MISP 是 CIRCL 维护的开源威胁情报共享平台,其 Feed 可以是某个组织提供的付费订阅,也可以是社区维护的开源订阅,这也是数据丰富的主要来源。

Elasticsearch 安装

首先部署 Elasticsearch 集群,系统使用 Ubuntu 16.04(文章使用虚拟机安装,DHCP 为该虚拟机预留了地址,确保其始终使用相同的 IP 地址)。

作者提供了 Vagrantfile 帮助配置构建 Elasticsearch 虚拟机。

ELK 安装

注意:TheHive 正在进行一些后端重构,这会导致设置复杂化。TheHive 背后的开发团队认为 Elasticsearch 已经不再满足它们的需求了,4.0 版本后将在后端使用 GraphDB。当前稳定版本 3.2.1 版本以及我们在此使用的 beta 版本 3.3.0 都是用 Elasticsearch 5.6 作为后端。因此,在虚拟机中需要部署 Elasticsearch、Logstash 和 Kibana 6.6.1 作为日志存储仓库,另一个 Elasticsearch 5.6.15 部署在 TheHive 虚拟机中作为后端。

虽然我总结了安装步骤,但是如果需要进一步了解细节可以查看安装指南

# 首先安装 Java,选择使用 OpenJDK 安装
sudo apt-get install openjdk-8-jre
# 添加密钥与仓库
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-6.x.list
sudo apt-get update
# 为了防止更新破坏 SearchGuard,选择安装固定版本的 Elasticsearch
apt-cache policy elasticsearch
sudo apt-get install elasticsearch=6.6.1 logstash=1:6.6.1-1 kibana=6.6.1
# 阻止软件更新
sudo apt-mark hold elasticsearch logstash kibana
# 将 Elasticsearch、Logstash 和 Kibana 设置为自启动
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch.service
sudo systemctl enable logstash.service
sudo systemctl enable kibana.service
# 未来确定好兼容性,可以进行升级
sudo apt-mark unhold elasticsearch

优化

默认情况下,Elasticsearch 依赖的 Java 堆的大小为 1 GB。可以通过修改 /etc/elasticsearch/jvm.options 中的 Xms1g 与 Xmx1g 参数,将其增加到总内存的 50-80%。我的虚拟机只有 4GB 内存,所以我保留了默认值。

编辑配置文件 /etc/elasticsearch/elasticsearch.yml

取消 cluster.name 和 node.name 的注释,并设置为不同的名字

设置 bootstrap.memory_lock 为 True

设置 network.host 为 0.0.0.0

设置 discovery.type 为 single-node

编辑服务 sudo systemctl edit elasticsearch.service

[Service]
LimitMEMLOCK=infinity

然后继续执行:

# 重新加载
sudo systemctl daemon-reload

# 重新启动
sudo systemctl start elasticsearch.service

# 检查确保 Elasticsearch 可用
curl http://localhost:9200/_cat/health

应该可以看到类似的响应:

1551641374 19:29:34 demo-cluster green 1 1 0 0 0 0 0 0 - 100.0%

Kibana

编辑 Kibana 的配置文件:sudo nano /etc/kibana/kibana.yml

设置 Kibana 来响应外部接口:server.host: 0.0.0.0

启动服务:sudo systemctl start kibana.service

打开浏览器:http://<IP-OF-VM>:5601 应该可以看到 Kibana 控制台

Logstash

按照如下命令执行:

sudo apt install logstash
sudo systemctl enable logstash.service
sudo systemctl daemon-reload

注意:此时 Logstash 没有运行。

Wazuh 安装

这部分将讲述如何安装 Wazuh Manager,并将 Wazuh 与 Elasticsearch 进行集成。

使用 Wazuh 的 Agent 及其规则集来识别端点的行为并生成告警。这些告警从 Wazuh 的 Agent 转发到 Wazuh Manager 写入 /var/ossec/logs/alerts/alerts.json。Filebeat 的服务不断监视该文件的更改,然后转发给 Elasticsearch。

Wazuh Manager

# 为 Wazuh 仓库安装 GPG 密钥
curl -s https://packages.wazuh.com/key/GPG-KEY-WAZUH | apt-key add -

# 添加仓库
echo "deb https://packages.wazuh.com/3.x/apt/ stable main" | tee -a /etc/apt/sources.list.d/wazuh.list

# 升级
sudo apt update

# 安装
sudo apt install wazuh-manager

详情请参见官方文档

Wazuh API

Wazuh API 是连接 Kibana 所必需的。Wazuh API 的默认账户密码是 foo/bar,如果想要变更可以查阅文档

# 安装 NodeJS
sudo curl -sL https://deb.nodesource.com/setup_8.x | bash -
sudo apt install nodejs

# 安装 Wazuh API
sudo apt install wazuh-api

# 取消自动更新
sudo apt-mark hold wazuh-manager
sudo apt-mark hold wazuh-api

Filebeat

curl -s https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -  
sudo echo "deb https://artifacts.elastic.co/packages/6.x/apt stable main" | tee /etc/apt/sources.list.d/elastic-6.x.list  
sudo apt update  
sudo apt install filebeat=6.6.1

首先安装 Filebeat:

# 取消自动更新
sudo apt-mark hold filebeat

# 下载 Filebeat 配置文件
sudo curl -so /etc/filebeat/filebeat.yml https://raw.githubusercontent.com/wazuh/wazuh/3.8/extensions/filebeat/filebeat.yml

# 编辑配置文件
sudo nano /etc/filebeat/filebeat.yml

在末尾的 YOUR_ELASTIC_SERVER_IP 部分替换为 Elasticsearch 6.6.1 服务器的真实 IP。

启动 Filebeat 服务:

sudo systemctl daemon-reload
sudo systemctl enable filebeat.service
sudo systemctl start filebeat.service

加载 Wazuh 模版

为 Elasticsearch 加载 Wazuh 模板。在 Elasticsearch 主机上运行此命令:curl https://raw.githubusercontent.com/wazuh/wazuh/3.8/extensions/elasticsearch/wazuh-elastic6-template-alerts.json | curl -X PUT "http://localhost:9200/_template/wazuh" -H 'Content-Type: application/json' -d @-

加载 Logstash 配置

下载用于 Wazuh 远程安装的 Logstash 配置文件,在 Elasticsearch 主机上运行此命令:curl -so /etc/logstash/conf.d/01-wazuh.conf https://raw.githubusercontent.com/wazuh/wazuh/3.8/extensions/logstash/01-wazuh-remote.conf

确保使用新配置文件运行 Logstash 服务:sudo systemctl restart logstash.service

安装 Kibana

首先尝试运行 Wazuh 文档中提供的命令:sudo -u kibana NODE_OPTIONS="--max-old-space-size=3072" /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.1.zip

如果发现错误:

Plugin installation was unsuccessful due to error "Command failed: /usr/share/kibana/node/bin/node /usr/share/kibana/src/cli --env.name=production --optimize.useBundleCache=false --server.autoListen=false --plugins.initialize=false
Browserslist: caniuse-lite is outdated. Please run next command `npm update caniuse-lite browserslist`

之所以运行命令 npm update caniuse-lite browserslist 产生错误,是因为本机尚未安装 Node。

卸载了插件并在没有 NODE 选项的情况下运行命令:sudo -u kibana /usr/share/kibana/bin/kibana-plugin install https://packages.wazuh.com/wazuhapp/wazuhapp-3.8.2_6.6.1.zip。此时安装将会成功,然后重新启动。

安装 Wazuh Agent

根据你自己的系统情况按照说明进行安装,本文在 Linux 上进行安装。

安装后,需要在 ossec.conf 中编辑 Wazuh Manager 的 IP 地址。Debian 的 Agent 安装在 /var/ossec,编辑 sudo nano /var/ossec/etc/ossec.conf 改变 MANAGER_IP 即可。

Agent 注册

我们使用简单的,不安全的方法注册 Agent:

在 Manager 上,运行以下命令启动注册服务:/var/ossec/bin/ossec-authd

在 Agent 上,使用 Manager 的 IP 地址运行 agent-auth 程序

对于 Linux 来说:/var/ossec/bin/agent-auth -m <MANAGER_IP_ADDRESS>

对于 Windows 来说:C:\Program Files (x86)\ossec-agent\agent-auth.exe -m <MANAGER_IP_ADDRESS>

应该可以看到如下输出:

INFO: No authentication password provided.
INFO: Connected to xxx.xxx.xxx.xxx:1515
INFO: Using agent name as: xxxxxxx
INFO: Send request to manager. Waiting for reply.
INFO: Received response with agent key
INFO: Valid key created. Finished.
INFO: Connection closed.

Wazuh 仪表盘

此时连接到 Kibana,就会在左侧工具栏中发现 Wazuh 的图标,点击此按钮跳转到配置 API 的页面:

Username: foo
Password: bar
Server: http://<WAZUH_Server_IP> 
API Port: 55000

保存 API 配置,然后点击跳转到 Overview 页面。点击页面顶端的 Agent 即可查看 ID 为 001 的 Agent,即之前注册好的主机。它显示为 Active 状态即视为正常,否则可能需要在 Agent 上确保更改 MANAGER_IP 成功并重启 Agent 的服务。

测试

在 Kibana 中,深入到 Management > Elasticsearch > Index Management 应该可以看到名为 wazuh-monitoring-3.x 的索引。然后转到 Management > Kibana > Index Patterns,如果还没有定义默认索引模式,点击 wazuh-monitoring,然后点击右上角的星号将其设为默认值。

点击 Discover 查看已创建的事件,可能暂时还没有。返回 Elasticsearch Index Management 页面,等待名为 wazuh-alerts 的索引出现。我们试图通过生成告警让其出现。

作为测试,转到另一个主机并尝试使用虚假的用户通过 SSH 登录主机:ssh [email protected]<wazuh_agent_IP>。这将会触发主机的 auth.log 出现无效的登录尝试,这将被 Wazuh Agent 获取,在新创建的 wazuh-alerts 索引中生成新条目。现在,我们就得到了一个存储告警的仓库。

MISP 部署

部署 MISP 可以允许 Cortex 或者任何能够发起简单 REST 请求的程序查询威胁指标,如 IP 地址、URL 与文件哈希。MISP 可以自主添加订阅与查询的源,返回的信息取决于订阅源提供的数据,而且订阅源之间的差异很大。有些只是提供了数据列表,有些提供了大量额外的信息。

将 MISP 通过 Docker 进行部署相比通过源码安装容易得多,哈佛安全小组提供了一个示例。请注意:如果将其部署到生产环境中,应该使用 build.sh,这样就可以在构建之前更改默认的 MySQL 密码与 MISP_FQDN。

初始化 MISP 数据库:docker run -it --rm -v /docker/misp-db:/var/lib/mysql harvarditsecurity/misp /init-db。这可以启动容器,运行脚本使用必要的数据库文件填充 misp-db 目录,最后删除容器。如果查看 misp-db 目录,可以发现已经新增了文件。

生成 SSL 证书

如果不生成 SSL 证书,Cortex 就不能请求 MISP,按照如下命令生成证书:sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /docker/certs/misp.key -out /docker/certs/misp.crt,如果没有特殊要求,可以接受所有默认选项。

运行容器

docker run -it -d \
    -p 443:443 \
    -p 80:80 \
    -p 3306:3306 \
    -v /docker/certs:/etc/ssl/private \
    -v /docker/misp-db:/var/lib/mysql \
    harvarditsecurity/misp

打开浏览器访问 https://localhost,使用 [email protected]admin 作为用户名与密码。系统会要求更改密码,新的密码至少包含 12 个字符,其中包含大写字母和特殊字符。

配置 MISP

在 Administration > Server Settings 与 Maintenance > MISP Settings 中设置 MISP.live 为 TRUE、MISP.disable_emailing 为 TRUE。

在 Sync Actions > List Feeds 的列表中选择订阅源进行订阅。我选了 malwaredomainlist,选中复选框然后点击顶部的 Enable Feed 就可以了。在列表中可以看到该订阅源,点击向下箭头就可以拉取所有事件,可以在 Administration > Jobs 处查看正在执行的任务。

点击放大镜图标,可以显示 IP 的列表,复制其中任意一个,之后会用到。

Postman

我们使用 Postman 来测试 API,在 File > Settings 中将 SSL certificate verification 设为 OFF。

在 MISP 中,在 Administration > List Users 中拷贝用户的身份密钥。在 Postman 中设置 Header 中的三个字段:

Accept application/json
Contect-Type application/json
Authorization <API_Key>

将用户的身份密钥粘贴到 Authorization 字段中。

在顶部将 REST 命令从 GET 改为 POST,API 设置为: https://localhost/attributes/restSearch

换到 Body 选项卡,点击 Raw 按钮并粘贴以下 JSON,将值替换为之前复制的 IP 地址:

{
    "returnFormat": "json",
    "value": "8.8.8.8"
}

应该会接收到以下响应:

{
    "response": {
        "Attribute": [
            {
                "id": "15",
                "event_id": "1",
                "object_id": "0",
                "object_relation": null,
                "category": "Network activity",
                "type": "ip-dst",
                "to_ids": false,
                "uuid": "5c8550db-5314-4538-a0d8-0146ac110002",
                "timestamp": "1552240859",
                "distribution": "0",
                "sharing_group_id": "0",
                "comment": "",
                "deleted": false,
                "disable_correlation": false,
                "value": "23.253.130.80",
                "Event": {
                    "org_id": "1",
                    "distribution": "0",
                    "id": "1",
                    "info": "malwaredomainlist feed",
                    "orgc_id": "1",
                    "uuid": "5c8550db-2d90-425f-9bc5-0146ac110002"
                }
            }
        ]
    }
}

此时,MISP 现在已经可以响应查询请求,为 Cortex 的加入做好了准备。返回订阅列表可以添加更多订阅源,在 Administration > Scheduled Tasks 中可以将 fetch_feeds 设置为 24 并点击 Update All 就可以配置好定时拉取任务。

TheHive & Cortex

这篇文章部署的 TheHive 3.3.0 RC5 与 Cortex stable v2.1.2,而 TheHive 4.1 版本(预计在 2019 年第二季度发布)后将取消 Elasticsearch 作为后端,转而使用 GraphDB。

注:后续使用 3.3.0 稳定版安装也可以正常使用。

安装 TheHive & Elasticsearch 5.6

# 添加仓库与密钥
echo 'deb https://dl.bintray.com/thehive-project/debian-beta any main' | sudo tee -a /etc/apt/sources.list.d/thehive-project.list
echo "deb https://artifacts.elastic.co/packages/5.x/apt stable main" | sudo tee -a /etc/apt/sources.list.d/elastic-5.x.list

wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo apt-key add -
curl https://raw.githubusercontent.com/TheHive-Project/TheHive/master/PGP-PUBLIC-KEY | sudo apt-key add -

# 更新并安装需要的 Java
sudo apt-get update
sudo apt-get install openjdk-8-jre

# 安装 Elasticsearch 5.6.15,这是仓库中最新的版本
sudo apt-get install elasticsearch

# 修改配置文件
sudo nano /etc/elasticsearch/elasticsearch.yml

cluster.name: hive
bootstrap.memory_lock: true
discovery.type: single-node

# 设置服务自启动
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
sudo systemctl start elasticsearch

# 检查响应
curl http://localhost:9200

# 如果安装成功继续安装 TheHive
sudo apt-get install thehive=3.3.0-0.1RC5

# 阻止版本更新
apt-mark hold elasticsearch thehive

# 编辑配置文件
sudo nano /etc/thehive/application.conf

# 取消注释,并更改密码
#play.http.secret.key

# 设置服务自启动
sudo systemctl daemon-reload
sudo systemctl enable thehive
sudo systemctl start thehive

打开浏览器,查看网站:http://<TheHiveIP>:9000,应该可以看到数据库更新消息:

点击 Update Database,如果没有看到上面的消息而是看到了登录框,意味着与 Elasticsearch 的连接中断了,请检测日志 \var\log\thehive

更新完成后,仍然有机会为管理员账户更改用户名与密码。还可以检查 Elasticsearch 名为 the_hive_14 的索引:curl http://127.0.0.1:9200/_cat/indices?v

如果忘记了管理员的账户与密码,请删除此索引重新开始。

安装 Cortex

注:安装 Cortex 3.0.0-RC1 会遇到一些问题,安装 Cortex 2.1.3 则不会遇到。

在 TheHive 主机上安装 Cortex:

sudo apt-get install cortex=2.1.3-1
sudo apt-mark hold cortex

安装 Cortex 有一些依赖需要先安装:

sudo apt-get install -y --no-install-recommends python-pip python2.7-dev python3-pip python3-dev ssdeep libfuzzy-dev libfuzzy2 libimage-exiftool-perl libmagic1 build-essential git libssl-dev
sudo pip install -U pip setuptools && sudo pip3 install -U pip setuptools

安装 Cortex Analyzer

从 GitHub 拉取源代码,为每个 Analyzer 单独安装 requirements.txt 的依赖:

cd /etc/cortex
git clone https://github.com/TheHive-Project/Cortex-Analyzers

本文的下载位置在:/etc/cortex

# 更改文件夹权限
chown -R root:cortex Cortex-Analyzers

# 为所有 Analyzer 安装依赖(两行作为一条命令执行)
for I in $(find Cortex-Analyzers -name 'requirements.txt'); do sudo -H pip2 install -r $I; done && \
for I in $(find Cortex-Analyzers -name 'requirements.txt'); do sudo -H pip3 install -r $I || true; done

安装依赖不可避免地会出现一些错误,解决此类办法的好方法是挑选要安装哪些 Analyzer 防止依赖冲突。修改 Cortex 的配置文件 application.conf 指向 Cortex-Analyzers 目录:sudo nano /etc/cortex/application.conf。取消注释 #play.http.secret.key,并更改密码。找到 ## ANALYZERS 的位置,将其改为 /etc/cortex/Cortex-Analyzers/analyzers

启动 Cortex:

sudo systemctl enable cortex
sudo systemctl start cortex

打开浏览器检查安装是否成功:http://<TheHiveIP>:9001。更新数据库并创建管理员用户登录,就像安装 TheHive 时做的那样。

Cortex 中规定必须在组织账户下登录才能启用、管理 Analyzer,否则只能创建组织与用户。

点击 +Add Organization 创建一个新组织,切换到 Users 标签页点击 +Add User 创建一个新用户,并且将新用户分配给创建的组织并分配 OrgAdmin 角色。保存后,点击 New Password 为刚创建的用户设置密码,按回车键保存。然后注销账户,用新用户登录。点击顶部的 Organization 标签页,点击 Analyzers 子选项卡,而不是顶部蓝色的 Analyzers 选项卡。如果 Cortex 配置正确,应该可以看到 Analyzers,按照我的配置安装了 113 个可用的 Analyzer。

可以启用以下几个 Analyzer,接受默认配置:

Abuse_Finder_2_0
CyberCrime-Tracker_1_0
Cyberprotect_ThreatScore_1_0
DShield_lookup_1_0
MISP_2_0
URLhaus_2_0
Urlscan_io_Search_0_1_0

除了 MISP 之外,这些都不需要 API 密钥或者进行进一步的配置。 点击 Users 子选项卡并创建一个新用户和 TheHive 集成。该用户应该分配 read & analyze 角色,这次可以不用为其设置密码,点击 Create API Key 并且拷贝该密钥。

点击页面顶端的 +New Analysis

不用管 TLP 与 PAP

更改数据类型为 IP

添加 8.8.8.8

选中你启用的 Analyzer 旁边的框

点击开始

修改 TheHive 的 application.conf 来指向 Cortex:sudo nano /etc/thehive/application.conf。滚动到底部,找到 #Cortex 部分,取消注释 play.modules.enabled += connectors.cortex.CortexConnector

添加 API 密钥与 URL:

play.modules.enabled += connectors.cortex.CortexConnector

cortex {
  "CORTEX-SERVER-ID" {
    url = "http://127.0.0.1:9001"
    key = "wrXichGSPy4xvjpWVdeQoNmoKn9Yxnsn"
  #  # HTTP client configuration (SSL and proxy)
  #  ws {}
  }
}

重启服务器,两个服务再次启动的时候就可以使用了。在 TheHive 点击 +New Case 测试 Cortex:

给事件一个名称与描述,然后打开这个事件,点击 Observables 选项卡,点击 +Add Observable 设置 Type = IP、Value = 1.1.1.1、Tag 为 test。只需要提供 tag 或者 description,不必二者都填。

在 Observable 列表中点击该 IP 地址,这将打开一个新选项卡,包含相关数据,也可以在底部看到 Analyzer:

点击 Run All,如果返回 Cortex 将会看到 Analyzer 在 Job History 标签页中运行。回到 TheHive,现在 Analyzer 应该有了最后分析的时间与日期。返回 Observables 选项卡并刷新页面,应该可以在 Observables 下看到一个标签列表:

导入报告模版

https://dl.bintray.com/thehive-project/binary/report-templates.zip 下载报告模版包。使用管理员帐号登录 TheHive,点击 Admin > Report templates 选择 Import templates,在其中选择下载的包。

现在,在 Observables 中点击最后分析时间时将会获得包含分析结果的报告:

启用 MISP

在 MISP 的页面上点击 Administration > Add User:

给用户分配一个电子邮件,[email protected]

将用户添加到 ORGNAME 组织

分配角色 user

取消底部所有复选框

拷贝用户 API 密钥

在 Cortex 的页面上点击 Organization > Analyzers,在搜索框中输入 misp,然后启用 MISP_2_0

为 MISP 服务器提供描述

URL = https://

key = AuthKey from MISP user you created

cert_check: False

现在回到 MISP 页面,点击 Sync Actions > List Feeds。找到其中一个订阅源,然后点击右侧放大镜,从列表中选择一个 IP 并复制。

在 Cortex 中点击 +New Analysis,添加 IP 的数据类型,然后粘贴复制的 IP 地址。选择 MISP_2_0 的 Analyzer 运行。在 Job History 页面点击 View 将会看到复制的 IP 列表名与其他信息。可以在 TheHive 中添加此 IP 为 Observables 进行测试。现在已经将 TheHive、MISP 与 Coretx 集成在了一起。

ElastAlert

最后一步是安装 ElastAlert 从 Elasticsearch 中的事件中生成警报。ElastAlert 当前版本要求 Python 2.7,本文安装在了 Elasticsearch 主机上:

sudo apt install python-pip
pip install elastalert

安装位置在:/home/username/.local/bin/elastalert,注:ElastAlert 也有 Docker 镜像提供。

配置 ElastAlert

创建一个目录来存储配置和规则:mkdir -p ~/elastalert/rules。可以拉取公开配置文件或者制作自己的配置文件,复制如下必要的设置,保存为 ~/elastalert/config.yaml

rules_folder: /home/username/elastalert/rules
run_every:
  minutes: 1
buffer_time:
  minutes: 15
es_host: x.x.x.x
es_port: 9200
use_ssl: False
writeback_index: elastalert_status
alert_time_limit:
  days: 2

运行 elastalert-create-index 在 Elasticsearch 中创建必要的索引。可以得到以下结果:

Elastic Version:6
Mapping used for string:{'type': 'keyword'}
New index elastalert_status created
Done!

创建规则

在 TheHive 页面中点击 Admin > Users,创建一个名为 elastalert 的用户,但不为其分配角色,并选中 elastalert。点击 Create API Key 并拷贝 API 密钥。TheHive 的管理指南指出:“为了更好地审计,一旦创建了用户,就无法删除该用户,只能锁定该账户”。

每条规则定义要执行的查询,触发匹配的参数与每个匹配触发的告警列表。本文中创建一个规则来识别失败的 SSH 登录,编辑规则文件 nano ~/elastalert/rules/failed_ssh_login.yaml

es_host: x.x.x.x
es_port: 9200
name: SSH Failed Login
type: frequency
index: wazuh-alerts-3.x-*
num_events: 2
timeframe:
    hours: 1
filter:
- term:
    rule.id: "5710"
alert: hivealerter
hive_connection:
  hive_host: http://x.x.x.x
  hive_port: 9000
  hive_apikey: <Paste API key for elastalert user here>

hive_alert_config:
  type: 'external'
  source: 'elastalert'
  description: '{rule[name]}'
  severity: 2
  tags: ['{rule[name]}', '{match[agent][ip]}', '{match[predecoder][program_name]}']
  tlp: 3
  status: 'New'
  follow: True

hive_observable_data_mapping:
    - ip: "{match[src_ip]}"

注意最后将 Observables 映射为 Types 的部分。尽管可以在标签字段使用嵌套的字段名({match[data][srcip]}),但对于 hive_observable_data_mapping 好像并不起作用。只能使用单个字段名('{match[srcip]}')。

我们需要修改 Logstash 主机上的 01-wazuh.conf 配置文件来解决这个问题。在 Logstash 主机上修改 01-wazuh.conf 文件 [data][srcip] 过滤器的部分,将 add_field => [ "@src_ip", "%{[data][srcip]}" ] 改为 add_field => [ "src_ip", "%{[data][srcip]}" ]。geoip 过滤器的部分,将 source => "@src_ip" 改为 source => "src_ip"

现在日志中应该已经有了 src_ip 字段,可以通过 Kibana 进行验证。在 Kibana 页面中选择 Management > Kibana > Index Patterns,选择 wazuh-alerts 索引模式,点击 Refresh 启用新字段:

# 测试规则
elastalert-test-rule ~/elastalert/rules/failed_ssh_login.yaml

# 运行 ElastAlert
elastalert --verbose --config ~/elastalert/config.yaml

针对运行着 Wazuh Agent 的主机生成一些告警:连续运行三次以下命令:ssh [email protected]

此时应该可以看到 Kibana 中显示了告警,ElastAlert 可以在下次运行时接收这些告警:

INFO:elastalert:Ran SSH Failed Login from 2019-03-31 18:21 UTC to 2019-04-02 15:01 UTC: 3 query hits (0 already seen), 1 matches, 1 alerts sent

在 TheHive 的 Alerts 下生成新告警:

点击右侧 Page 图标预览告警,可以为其分配一个模版,然后导入它:

这时已经完成了全部任务,Wazuh 生成的告警已经能在 TheHive 中显示为事件了。

*参考来源:Arnaud Loos,FB 小编 Avenger 编译,转载请注明来自FreeBuf.COM

Eternalblue _ The NSA-developed Exploit That Just Won't Die

2017年,Shadow Brokers将从美国国家安全局NSA窃取的软件漏洞利用攻击泄露在网上,之后1个月知名勒索软件WannaCry就席卷全球。现在已经过去2年了,Eternalblue仍然占据着美国的头版头条。本文就Eternalblue和Eternalblue为什么可以不死进行简要分析。

Eternalblue

CVE-2017-0143到CVE-2017-0148漏洞是Windows 7, Windows Server 2008, Windows XP和运行在445端口上的Windows 10系统中使用的Microsoft SMBv1服务器系列漏洞。原始Eternalblue可执行文件中硬编码的字符串表明攻击的Windows版本有:

image of code from eternalblue

漏洞影响范围不仅限于Windows系统,还包括使用Microsoft SMBv1服务器协议的设备,比如Siemens超声医疗设备。

Eternalblue本身主要是与漏洞CVE-2017-0144相关,该漏洞通过发送特殊伪造的消息到SMBv1服务器来允许远程攻击者在目标系统上执行任意代码。其他相关的漏洞利用有Eternalchampion, Eternalromance, Eternalsynergy,这些都是被美国国安局NSA相关的APT黑客组织Equation Group标记的。

image of eternalblue folder

Eternalblue为什么广泛传播?

SMBv1协议的漏洞已于2017年3月打补丁修复了。但2年过去了,仍然有超过100万联网的设备仍然受到该漏洞的影响。

image of Shodan Eternalblue top countries

从全球范围来看,最需要修复的Windows版本为Windows Server 2008和2012 R2版本。

image of unpatched windows versions vulnerable to eternalblue

其中有40万受Eternalblue漏洞影响的设备位于美国,其中有超过10万台(约占1/4)设备位于加利福尼亚州,这是美国科技产业的心脏。

image of Shodan top US Cities

目前不仅仅是勒索软件在使用Eternalblue,几乎所有需要蠕虫功能的恶意软件都可以发现Eternalblue的利用。2019年1月,研究人员还发现有加密货币挖矿机通过Eternalblue和Beapy攻击位于中国的企业。

勒索软件在2018年短暂淡出人们实现后,Eternalblue再次成为美国的头条。

image of sentinel one twitter conversation

Eternalblue如何被使用?

用Eternalblue利用CVE-2017-0144漏洞的技术是NSA开发的,该工具集在网上泄露后,目前已经成为全世界广泛使用的工具了。

image of shadow brokers leak

为了成功利用该漏洞,未授权的攻击者需要发送一个经过恶意伪造的包给服务器,这也是WannaCry和NotPetya勒索软件能够进行自我繁殖和传播的原因。Eternalblue会允许勒索软件访问网络上的其他机器。攻击者可以利用Equation Group开发Shadow Brokers泄露在网上的DoublePulsar作为payload来安装在有漏洞的目标机器上,并启动勒索软件的副本。

image of DoublePulsar exploit

Eternalblue工作原理

Eternalblue依赖于一个名为 srv!SrvOS2FeaListSizeToNt的Windows函数。下面先讲一下SMB工作原理以及如何导致远程代码执行。

SMB (Server Message Block) 是用来从网络上的服务器系统来请求文件和打印服务的协议。在协议的说明中有允许协议来通信关于文件扩展属性的信息,尤其是文件系统中关于文件特征的元数据。

Eternalblue利用了3个不同的bug。第一个是协议尝试映射OS/2 FileExtended Attribute (FEA)列表结构到NT FEA结构来确定需要分配的内存大小的数学错误。错误计算创建了一个整数溢出导致分配的内存比预想的要小,最终导致缓冲区溢出。如果要写的内容太多,额外的数据就会溢出到相邻的内存空间。

利用第二个漏洞可以触发缓冲区溢出,这是由于SMB协议定义的两个子命令SMB_COM_TRANSACTION2和SMB_COM_NT_TRANSACT的差别。如果有太多的数据要包含在一个单独的包中,就需要_SECONDARY命令。TRANSACTION2和NT_TRANSACT的关键区别在于后者调用的数据包是前者大小的2倍。如果客户端使用NT_TRANSACT子命令在TRANSACTION2子命令前发送伪造的消息,就会出现验证错误。如果协议发现接收了2个分开的子命令,就会根据最后接收的包的类型来分配类型和大小。因为最后接收的包比较小,所以第一个包会占用比分配空间更多的空间。

一旦攻击者完成初始的溢出,就可以利用SMBv1中的第3个漏洞来进行Heap Spraying(堆喷射),导致在给定地址分配一块内存。然后,攻击者就可以写入和执行shellcode来控制系统。

image of metasploit

Sean Dillon写了一个Ruby脚本可以扫描目标来确定系统是否未修复,并利用所有相关的漏洞。

image of Sean Dillon's Eternal blue Ruby script

Eternalblue – Here To Stay

Shadow Brokers泄露的代码中含有其他3个漏洞利用:Eternalromance, Eternalsynergy和Eternalchampion。

image of different eternal blue malware types

如何应对?

截至目前,预防使用Eternalblue的攻击的最重要的事情是确保更新Windows系统来应用MS17-10安全补丁。如果无法更新,可以禁用SMBv1,不要将有漏洞的机器连接到互联网。

前言

在本文中,我们将主要讨论一个值得关注的功能滥用问题,通过该漏洞,攻击者可以窃取甚至控制Slack用户使用Windows环境的Slack桌面应用程序的下载内容。根据我们的协调披露政策,已经通过HackerOne平台向Slack报告了这一漏洞,并且Slack已经在其最新更新v3.4.0中修复了该漏洞。

这一漏洞可能允许远程攻击者在Slack频道中提交精心伪造的链接,一旦受害者点击该链接,那么就会将Slack客户端的下载位置更改为攻击者控制的SMB共享。这样一来,受害者此后下载的所有文档可能都会最终上传到攻击者控制的文件服务器上,直到受害者发现这一配置信息被篡改,并手动修改回来为止。在攻击者的服务器上,攻击者不仅可以窃取文件,甚至还可以在文件中插入恶意代码,从而在受害者下载该文件并通过Slack应用程序打开时,感染受害者的主机。

上述攻击技术依赖于Slack处理链接的方式,以及未正确配置的slack://协议链接。在本文中,我们将讨论此类攻击的一些有趣应用。

更改设置

Slack是一款Electron应用程序,它使我们的逆向工程工作变得非常容易。作为使用Slack的用户,我已经熟悉的一个功能是“slack://”超链接。我认为,这可能是一个值得关注的攻击向量,因此通过一些研究,我找到了处理这些协议链接的对应代码区域。查看这些函数,我们在protocol-link.ts模块中发现了一个值得关注的模块,它可以在单击时更改Slack应用程序的设置。

1.png

我们可以查看包含所有Slack设置的Settings-Reducer.ts模块,找到可以更改的可用设置项。

2.png

几乎所有这些设置,都可以通过slack://setting链接进行修改。

下载位置劫持

在研究了我们可以改变的所有设置之后,我发现通过slack://协议处理程序能够访问的设置中,有一个最值得关注的,就是“PrefSSBFileDownloadPath”设置。这一设置能够改变用户的下载目标路径。假如攻击者构造一个类似于“slack://settings/?update={‘PrefSSBFileDownloadPath’:’<pathHere>’}”的链接,那么在受害者单击时,就会更改默认的下载位置,直至用户发现并手动更改回来为止。

但是,在恶意构造的链接中,不能包含某些字符,因为Slack会将它们过滤掉。其中的一个字符就是“:”(冒号),这意味着我们实际上无法提供带有驱动器根目录的路径。然而,SMB共享完全绕过了这种限制。因为它不需要根驱动器,在设置远程SMB共享后,我们可以向用户或频道发送一个链接,在点击该链接后,会将所有下载重定向到该链接。

3.png

在单击此按钮之后,我们可以看到,在高级设置(Advanced Settings)中成功的进行了更改。

4.png

此时,如果我们下载文件,则如下所示。

5.png

实际上,会将其上传到相应的远程SMB共享。

6.png

攻击向量

从实际的角度来看,链接的文本应该是经过模糊的。如果该链接看起来存在明显的异常之处,具有一定安全意识的用户很有可能不会点击这一链接。为了实现这一点,攻击者可以选择几种方案。

(1)经过认证的频道成员

我们在研究Slack文档时,发现似乎不可能在频道中发送一个超链接:

7.png

但是,在对Slack API进行更深入的分析之后,我们又阅读了相应的文档,最终发现可以通过附件(Attachments)文功能实现本超链接。具体而言,这可以通过使用适当的字段,在Slack POST请求中添加“Attachment”字段来实现:

8.png

在将该消息发送至频道后,即可将 http://google.com 超链接到我们特定的恶意Slack链接,而不是在单击时。

9.png

在单击时,将会立即更改受害者Slack的下载位置。

(2)未经认证的频道成员

如果我们不是Slack频道的成员,那么可以使用这种方法。这种方法非常值得关注的,因为我们都想知道,是否能在不加入特定频道的情况下,向其中发送恶意链接呢?

答案是肯定的。

这可以通过RSS源的方式来完成。Slack频道可以订阅RSS源,并使用可以包含链接的站点更新来发送至频道。我们以reddit.com为例,进行实际分析,可以尝试发送帖子到一个非常受欢迎的Reddit社区,全世界的Slack用户都订阅了这一社区。在本文的测试用例中,我选择了一个我拥有的私有用户。由于slack://链接不允许在Reddit上实现超链接,因此我将尝试投放一个HTTP链接,它将重新定向到我们的恶意slack://链接,并在单击时更改设置。

10.png

一旦发布到这一Subreddit,我们的测试Slack频道(已经订阅到此Subreddit源)将会填充新文章条目,并预览包含该链接的文本。

11.png

然而,这种技术有一些缺点:比如当受害者点击该链接时,浏览器会提示如下的对话框,受害者必须单击“是”,才可以立即更改他们的Slack客户端的下载位置。

12.png

总结

具有一定安全意识的Slack用户可以发现这种恶意技术,然而,随着长期以来网络钓鱼事件频发,每一位用户都应该具有“不要随意点击链接”的安全意识。RSS源进行漏洞利用,这一漏洞的影响将会进一步扩大。此外,当我们控制上传的共享位置时,我们就可以轻松修改下载的内容,这意一旦攻击者通过不受信任的味着,Slack用户在打开或执行文件时,实际上是在与远程SMB共享中已经和攻击者修改的文档、脚本等文件进行交互,这也会为攻击者创造无限的可能性。

Slack官方对这一漏洞进行了调查,发现目前没有迹象表明这一漏洞曾经被利用过,也未发现用户受到影响的报告。

前言

之前使用TPYBoard v202(主控ESP8266模块)开发板做过一款WIFI攻击神器,一开始使用Arduino源码做的,后来又接触到micropython。觉得使用micropython真是方便,而且ESP8266模块上面有很多可以挖掘出来的好玩的。后期用它又做过智能家庭控制平台,说白了就是用v202开发板作为Web服务器。最近,接触到了DS3231时钟模块,结合OLED显示屏,做了一个简单的时钟。为了防止时间偏差,从网上找了一个免费的获取时间的API,程序很简单,分享出来,有需要的小伙伴可以直接用。

WIFI攻击神器-Arduino篇:

邪恶改装:TPYBoard制作廉价WIFI干扰器

邪恶改装2:用单片机实现一次简单的WIFI密码欺骗

WIFI攻击神器-micropython篇: MicroPython实现WIFI干扰与抓包

智能家庭控制平台:利用单片机快速实现家庭智能控制平台

材料准备

名称 数量
TPYBoard v202开发板 1块
DS3231时钟模块 1个
OLED显示屏 1个
面包板 1个
杜邦线 若干

准备好材料,接下来就是接线。

TPYBoard v202 DS3231时钟模块
3V3 VCC
GND GND
SDA SDA
SCL SCL
TPYBoard v202 OLED显示屏
GND GND
3V3 3V3
MI SCK
MO SDA
G16 RES
G15 DC
G5 CS

程序编写

先说下程序的思路:

1、开机上连接家中的WIFI网络,确保可以访问网络;

2、然后访问API获取到时间,更新DS3231的设置,并进行显示屏显示;

3、开启定时器,每隔1秒钟刷新下显示屏时间信息;

4、设定每天获取一次API更新下时间,用于时间的校正。

首先,编辑一个boot.py文件,里面主要是连接WIFI的程序。然后编辑一个main.py,里面主要是访问API、操作DS3231、显示屏等主要功能程序。v202开机会先运行boot.py再运行main.py文件。

boot.py 

import network
import time
from machine import Pin

LED = Pin(2,Pin.OUT)
#根据设定连接网络
count = 0
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
    print('connecting to TurnipSmart...')
    wlan.connect('WIFI名称','WIFI密码')
    while not wlan.isconnected() and count < 20:
        LED.value(not LED.value())
        count += 1
        time.sleep(0.5)
if wlan.isconnected(): 
    LED.value(0)
    print('ip address:',wlan.ifconfig()[0])
else:
    LED.value(1)
    print('TurnipSmart connect fail')

main.py

import urequests
import json
import time
from machine import SPI,Pin   #导入SPI、Pin库
import ssd1306                #导入OLED显示屏驱动库
from ds3231 import DS3231     #导入DS3231时钟模块库
from machine import Timer     #导入Timer库

#-----------------------DS3231模块-----------------------#
ds=DS3231()            #ds3231初始化
NOW_DATE = ''
#-----------------------OLED显示屏-----------------------#
#SPI接口对应的引脚定义
spi = SPI(baudrate=10000000, polarity=1, phase=0, sck=Pin(12,Pin.OUT), mosi=Pin(13,Pin.OUT), miso=Pin(2))
#OLED显示屏的设置,128宽 64高 spi对象 DC接的G15 RES接的G16 CS接的G5
display = ssd1306.SSD1306_SPI(128, 64, spi, Pin(15),Pin(16), Pin(5))
display.poweron()                   #打开显示屏
display.init_display()              #初始化显示
display.text('Waiting.....',1,1)    #显示的内容,x坐标,y坐标
display.show()                      #进行显示

def getNetTime():
    url = 'http://quan.suning.com/getSysTime.do'
    res=urequests.get(url).text
    print(res)
    j=json.loads(res)
    t2_date = j['sysTime2'].split()[0] #日期
    t2_time = j['sysTime2'].split()[1] #时间
    display.fill(0)                  #清屏
    display.text(t2_date,1,2)
    display.text(t2_time,1,15)
    display.show()
    #初始日期和时间,设置一次即可
    ds.DATE([int(x) for x in t2_date[2:].split('-')])   #设置初始日期年、月、日
    ds.TIME([int(x) for x in t2_time.split(':')])   #设置初始时间时、分、秒

def updateTime(t):
    global NOW_DATE
    #读取日期和时间,拼接成正常的时间格式
    date = '20'+'-'.join(ds.DATE())
    time = ':'.join(ds.TIME())
    if NOW_DATE != date:
        getNetTime()       #设定每天校对一下时间
        NOW_DATE = date
    else:
        display.fill(0)                  #清屏
        display.text(date,1,2)
        display.text(time,1,15)
        display.show()

if __name__ == '__main__':
    getNetTime()
    time.sleep(1)
    #-----------------------Timer定时器-----------------------#
    tim = Timer(-1)  #新建一个定时器
    #每隔1秒执行一次updateTime函数调用,用于更新OLED显示屏上的时间
    tim.init(period=1000, mode=Timer.PERIODIC, callback=updateTime)

里面还需要用到DS3231时钟模块库,已经写好了,直接拿来用就可以。记得也要下载到板子里,否则会提示找不到。文章末会有下载。

程序下载与调试

v202通过micro USB数据线接入PC,即可进行程序下载和REPL操作。插入PC之前,先确保一下器件的电源线没有接错,防止出现器件或开发板烧坏的情况。

1、插上PC之后,设备管理器会出现一个虚拟串口,开发板上用的是CH340芯片(USB转TTL串口),电脑没驱动的话,需要手动安装。

CH34X驱动下载

2、使用MicroPython File Uploader 工具进行程序的下载,在这里就不介绍具体下载的步骤,大家可去参考现有教程。TPYBoard v202 快速入手教程  boot.py 、main.py 和 ds3231.py 都需要下载到v202板子里。下载完毕后,点击【RUN】或者按板子的RST键都可以运行程序。

没找到上传附件的功能,把代码放到了GitHub上了。GitHub地址

效果演示

1.jpg

总结

这个实验还有很多需要完善的地方,比如网络连接的判断、自动重连等机制都没有加上,大家可以自己完善下。欢迎交流。

*本文作者:linsensen,本文属FreeBuf原创奖励计划,未经许可禁止转载。