Shenzhen IO 是款很小众的游戏,某国同学发现自己的国家很难去制造什么东西,所以来到了深圳加入了一家电子公司 “深圳龙腾科技有限公司”。游戏中你将扮演这位同学,使用公司的各种芯片,设计电路板,烧入汇编语言来实现各种需求。

游戏的特色就是高仿真,整个游戏基本上就是一个 CAD 系统,只要按规范生成出那些芯片就真能生成出各种板子了,接上机床就可以开始量产了。同时也是不错的熟悉单片机设计,汇编语言的培训工具。

另外选取的需求也挺有趣,都是真实、有用的。比如植物自动浇水,控制三明治机器等等。

而且这是款可以光明正大玩的游戏,因为看起来你真的就是在工作。

在服务器上有时候需要安装一些软件,但是下载地址被 GFW 给墙了。手上只有 Shadowsocks 可以用,所以研究了下怎么在服务器上用起来。只需要用到 Shadowsocks 的命令行客户端启动一个 SOCKS 代理,然后用 polipo 转化成 HTTP 代理,就可以通过环境变量 http_proxyhttps_proxy 在命令行中使用代理了。

最近已经把 Bear 作为自己的主力笔记应用了,之前是同时用 Day OneUlysses 。Ulysses 还会偶尔用到导出和发布到 Medium 的功能,以及 把富文本或者网页上内容转成 Markdown ,Day One 基本上不用了。

Day One 和 Ulysses 都是很优秀的笔记应用,但是都会有一些不符合我使用需要的一些地方,导致不得不两个一起用,形成互补,但是内容分散在两个应用里还是非常不方便。而 Bear 的出现基本满足了我的需求。

UCloud API 需要把所有请求参数拼接起来进行签名。在 Paw 中测试 API 时可以添加 URL Params 参数 Signature,使用 JS Script 的 Dynamic Value 进行拼接,组装上 private key 之后再用内置的 SHA1 就能得到最终的签名了。

拼接使用的 JavaScript 代码如下:

// context docs: https://paw.cloud/docs/reference/ExtensionContext
// request docs: https://paw.cloud/docs/reference/Request

function evaluate(context){
    var req = context.getCurrentRequest();
    return req.getUrlParametersNames().filter(function(k) { return k != "Signature" }).sort().map(function(k) {
        return k + req.getUrlParameterByName(k);
    }).join("");
}

Paw 会提示 URL Params 使用 JS Script 会有递归依赖的问题,忽略掉就可以。不过注意在上面的 JavaScript 代码中需要跳过 Signature 参数。

最近看到一篇文章详细说明了如何通过 Redis 获得 SSH 登录权限。简单来说就是如果 Redis 开放了外网端口访问,又没配置防火墙,也没有配置任何 Redis 的连接验证,而且还是用很高权限的用户在运行 Redis,就可以通过 dump 数据库把任意 key 注入到 authorized_keys 文件中,从而获得用户的 SSH 登录权限。条件很苛刻,但是很容易自动化,估计还是可以扫描到不少肉鸡的。

比较惭愧,最近部署的一台服务器就被该方法攻击了。主要原因是之前我已经书面说明了防火墙如何配置,所以想当然的认为拿到的机器已经配置好了。为了让 Redis 在内网内能访问,配置脚本中将监听的地址改成了 0.0.0.0,也没有配置连接验证,结果就是任何人都能连接上这个数据库。不过因为还是用的单独的 redis 用户运行,权限有限,攻击者并没有拿到 SSH 登录权限,只是把数据库清空了。所幸是测试服务器,数据库中的数据并不重要。

下面说明下我所了解的保护服务器安全的一些常识。