对某网络认证系统的研究

警告:技术无罪,莫用作非法用途。

如进行不合理使用所造成任何法律责任,笔者概不负责。

迁入大学校内的宿舍后,我对垄断该宿舍的网络公司所使用的认证系统进行了一番研究。


1.初探

该认证系统在未登录时封锁除80及443以外的所有TCP端口;UDP未予详细测试,但至少知道UDP/53(DNS)应该未被其封锁/篡改——经测试,未登录时DNS也能返回正确的记录。

该系统登录页面具有域名(下以a.net代称),并使用了HTTPS。值得注意的是,这个系统可以在未连接该网络时访问,此时登陆账户,不能上线,只能查看账户信息或充值等;通过nslookup可知其使用了CloudFlare的CDN。

未登录时,通过HTTP(TCP/80)访问任何网站,会被其网关302重定向至https://a.net,而使用HTTPS(TCP/443)访问任何网站,网关会发回https://a.netServerHello包,此时:

  • 一些浏览器提示"证书错误",阻止用户继续访问
  • 另一些(更聪明的)浏览器会提示WiFi需要登录,并询问是否跳转至登陆页面

我发现,此时访问https://a.net的IP与用手机网路访问时一样,都属于CloudFlare。于是我做了一个尝试。


2.猜测

  • 将HTTP无条件301到https://a.net
  • 对HTTPS试图识别访问的主机名,如不是a.net,则充当TCP代理,将用户的ClientHello发至https://a.net,并返回https://a.netServerHello等后续数据包……

    3.尝试

获取HTTPS所访问的主机名,方法大抵有两种:

  1. 通过TLS SNI扩展中的servername字段
  2. 通过证书的subjectAltName(下简称SAN)

于是我试图构建一个HTTPS连接,但其具有如下特点

  • SNI扩展中的servername字段为a.net
  • Host这一HTTP Header的值为hardrain980.com

返回了本站首页的HTML。由此证明,该系统是通过TLS SNI扩展来识别HTTPS所请求的主机名,并根据此做出对应操作。


4.后记

  1. 似乎Stunnel能自定义SNI。Server配合后端,将其监听于TCP/443,Client模式下使用a.net做主机名或能绕过此系统。
  2. 此系统若通过证书来识别HTTPS主机名,自签名一个SAN包含a.net的证书或仍可绕过。
  3. 若此系统同时通过PKI检查证书有效性,则无解。
  4. 不明白此计费系统在未登录时为何不使用IP白名单,是因为CloudFlare CDN的IP会变化吗?
  5. 我付费使用该公司提供的网路,未使用信息技术谋取非法利益。

这网路的无线覆盖很垃圾,AP看起来是后安装的(墙壁上有走明线的管子),既没安在房顶上,也没放在靠中间的位置。奇怪的是网络信号5格却时常掉线,令我不得不使用USB网卡(XPS15没有RJ45端口)。

小谈过去的一年接的几个运维私活

2018.1.9 开始填坑。突然发现这个坑还是我回国前开的,已经一个多月了……

过去的一年里我接了几个运维的私活(历时共半年)。收入微薄,能提供我的VPS、域名及SSL证书所需要之费用,除此之外所剩无几;主要目的则是积累经验。


一、客户背景&面试内容

注:"面试"内容不能完全记清,只能最大程度回忆。

客户性质 所用程序 "面试"内容 备注
个人
  • WordPress
  • Apache 2.2/CentOS 6
  1. Apache Rewrite Rules
  2. Apache 日志分析
  • Discuz X3.2
  • Apache 2.4/Ubuntu 16.04 LTS
  1. iptables - Reject与Drop掉来自特定IP的访问
  2. grep - 查找指定目录下所有包含特定字符串的文件
  3. find - 将某目录下所有文件和目录分别设置不同的权限码;查找特定大小、特定修改时间(段)、特定后缀名的文件
  4. sed - 注释与取消注释代码中指定的某几行
  • WordPress
  • Nginx/Ubuntu 16.04 LTS
(没面试)
  • WordPress
  • OwnCloud 9
  • Apache 2.4/Ubuntu 16.04 LTS
  1. Apache Rewrite Rules
  2. systemd 相关(systemctl:开始/停止/重启/重载/启用/停用/查看状态;journalctl:查看特定程序日志)
  • Typecho
  • Caddy/Ubuntu 16.04 LTS
  1. 正则表达式相关
  2. find - 查找指定修改时间(段)的文件
  3. systemd - service文件
企业
  • 未知(自行开发)
  • Apache 2.4/RHEL 7
  1. TCP/IP相关 - (二进制表示)子网掩码与IP段关系
  2. ifconfig - 设置静态IP
  3. iptables - reject来自特定IP到特定TCP port的连接。
  4. mod_security2 - 阻止分布式暴力破解密码(暴力破解频率达到阈值时仅白名单用户可访问登陆页面,其余全部返回HTTP 503),被卡(不会)
  5. find - 查找某目录下特定修改时间(段)且具有特定扩展名的文件
  6. grep - 查找某目录下有特定后缀名且包含特定pattern(需用正则表达式)的文件
  7. sed - 查找特定的pattern(需用正则表达式)并替换为特定string(无需正则表达式)、删除某几行
  8. 提供几个PHP文件,找出其中哪个有"后门" - 后门是通过语言生成器eval()实现的"一句话"木马。
 存在未能回答的问题(mod_security2)
未知
  1. sysctl - 禁止Ping(ICMP)、修改默认TTL、更改TCP拥塞算法
  2. iptables - 端口转发(内网穿透?)
  3. find - 删除某目录下指定修改时间(段)的文件
  4. sed - (问题很多,没记清)
  5. awk - (不会,因此被卡)
面试未通过.

二、感受

主要说那个企业吧,因为五个个人项目所用程序我都有使用过,唯独两点是例外

  1. CentOS 6(RHEL 6)不具有systemd。
  2. 我没有用过Caddy,但是其从安装到配置似乎十分简单且Documents完备。

这个企业给我的印象并不好,但我也毫无办法——毕竟是通过熟人介绍才令我获得面试的机会。我作为个人,又没有任何正经的工作经验抑或是认证,很难自行申请企业的职位。

1.他们欺骗了我——自称其业务是租赁,但实为网贷。

网贷给我的印象很不好,一是因为影响极其恶劣的借贷宝"裸条"事件;二是我的同学有人欠网贷平台的债导致我受到短信轰炸——后来我发现网贷平台的Android APP都要求通讯录权限,便知道他们是如何获取我的手机号了……

2.他们给我的薪资与交给我的任务并不对等。

这个公司的管理人员曾评价我"水平高,比全职的(运维)都高"——这并非是因为我有多么高的技术水平,而是因为他们交给我的差事比一般运维人员分内的多很多,并且我比较好地(至少是令对方满意地)将其完成了罢了。

我要负责的是他们的网页服务器,同时也为手机App提供API。倘若把TCP/IP四层模型再添加一个第五层——后端,即用于生成应用层内容,如PHP。那么我恐怕只有第一层(物理层)的东西未曾接触。试问一般的运维会去帮他们处理那些PHP的程序中的问题吗?他们的软件工程师去哪了?

3.他们很能造次,而"玩脱了"后又无法收拾自己的烂摊子,实乃烦人——后文会加以描述

4.极度吝啬——不愿购买操作系统的授权,不愿花钱购买SSL证书。


三、奇葩的系统环境

我接手时,这个公司的HTTP服务器用的是Apache 1.3.42,通过cygwin在Windows Server 2008(没有R2)运行。

众所周知,Apache 1.3最后一个版本(1.3.42)发布是在2010年,至今7年;而第一个版本发布则是上个世纪的事了。Google检索Apache 1.3.42,第一个联想到的关键词便是exploit,谈何安全?

于是我使用了由Apachelounge编译的用于Windows的Apache 2.4,并在解决一堆Apache 1.3与2.x的配置文件兼容性问题后,将其用作生产环境。PHP版本也从5.3.x升级至7.1,似乎未出现不兼容。

好景不长,不久这家的服务器不断被上传一句话木马,而我却无从得知骇客是如何上传的——尽管这家的PHP程序只用正则表达式检测文件名,甚至没有检测mime type或是文件内容,可文件名竟是.php的。

抓包分析后才发现,骇客是通过上传不被Windows的NTFS文件系统允许的文件名来挂马——其上传的文件名类似a.php.,而这个文件会被Windows改成a.php,这样既不被\.php$匹配,又可以被解析。鉴于此,我建议他们弃用Windows操作系统,转为使用RHEL——尽管我个人觉得RHEL/CentOS使用不如Debian/Ubuntu方便,软件源提供的程序又少又旧,但还是看中了10年的支持周期。

然而这家公司并不愿意支付RHEL的使用授权——甚至其之前使用的Windows Server也是盗版的。最后我只得使用CentOS。

(T.B.C.)

令人作呕的同程旅游

同程旅游这个平台,说来很多人恐怕不熟悉。然而,它是和微信钱包合作的商家。

最近我在微信钱包所提供的"机票/火车票"中检索回国(悉尼-北京)的机票,但对其所提供的机票的时间和价格都不满意,便没有订票。

然而,一天后,同程旅游却连续用短信平台号码给我发来如下两条信息:

10655024056448007:

【同程旅游】尊敬的同程会员您好,我是您的机票&酒店专属顾问:徐涛,工号:29656,微信:18662505276,手机:18662505276,如您最近有出行计划可直接通过微信或电话与我联系, 为您推荐合适的航班及酒店,申请优价服务,期待您的联系!回复TD退订

10691010938:

【同程旅游】您浏览的悉尼-北京航线票量已开始紧张,机票早订更优惠,戳https://s.ly.com/6kqmhkwD预定!回TD退订


我不能确定同程旅游通过什么途径知晓我的手机号,是微信向它出卖了我的手机号?还是我今年8月用它订火车票的时候它记录了我的手机号?我更倾向于后者。

提起8月份,我于辽宁省旅游期间在同程旅游上订了一张火车票,然而订票时,它并没告知我需要到"自提点"领取,而不是在售票大厅的12306自助机上领取;更令人气愤的是它提供的自提点地址不正确,险些令我不能赶上火车。

我向沈阳北站外一名警察询问自提点具体位置,原来是在附近一家旅店里!我问完还听到那名警察说"怎么老有人问这家,它们写不明白啊……",可见同程旅游没少坑人。


总而言之,我对这种滥用我隐私信息的行为十分反感,恐怕再也不会考虑在同程旅游这个平台上购买任何商品或服务了。

论微软的"精神股东"

数日前,我在知乎网吐槽了一句微软Windows10的"双设置"——也就是开始菜单中的"设置"与"控制面板",便招来软狗问候我的家人。

更有软狗嘲讽我说

有本事你不用Windows

的确,我完全可以摆脱包括Windows10在内的微软公司的狗屎软件,除了Adobe的部分软件不被Linux支持(可通过Wine实现),对我的笔电*1而言,就连驱动程序,Ubuntu做的也比Windows10高到不知道哪里去了。

当然,软狗(微软的"精神股东")要么目光短浅且无知,要么沉迷电游,才会有如此弱智的言论。


Windows10的双设置,究竟怎样不方便?我想可以这样解释:

将"设置"中可调节的选项设为A集合,控制面板中可调节的选项设为B集合。

  • 对于Windows 7,A=Ø
  • 对于Windows 8/Windows 8.1,A⊊B(设置有的选项,控制面板都有)
  • 对于Windows 10,A∩B⊊A且A∩B⊊B(有的选项仅出现在设置,有的仅出现在控制面板)

实在搞不懂微软的逻辑。

有人说这样是为了简化操作,但简化操作为何不将"双设置"合并,再像Intel核心显卡的控制面板一样,添加一个[基础模式-专家模式]的选项?


此外,这台电脑*2在Windows 10 1709"毁灭者"更新的加持下,运行的比使用5400rpm机械硬盘的电脑更慢——打开Chrome要等待1s,打开Xshell 5甚至要等待3s。

而Windows的驱动体系我更是无力吐槽——

  • 自带的无线网卡驱动会导致无规律蓝屏*3,我更换厂商提供的(不会导致蓝屏的)驱动后,Windows 10却重新加载自带驱动,我只得找到自带的驱动程序文件并将其删除来解决
  • 自带的声卡驱动会爆音,而厂商提供的无问题。因我未找到自带声卡驱动的文件,无法将其删除,故此问题目前尚未解决

而我尝试用LiveCD启动Ubuntu Gnome,发现它不仅能让除独立显卡外的任何硬件正常运作,而且也完全没有Windows这层出不穷的问题。


*1. Dell XPS15-9560
*2. 采用128GiB Sandisk X400
*3. 日志也无法提供任何对troubleshooting有帮助的信息,这是Windows的另一个巨大缺点