Typecho被getshell之反思

人的一生啊就是这么不可预料,一个人的命运,当然要靠自己奋斗,但是也要考虑历史的进程。所以对我来说这可能就是“历史的钦定”吧!当然这些都是后话了,关于最近Typecho爆出的两个漏洞,我不幸中枪。这其中主因在于自己,毕竟那台腾讯云一只在吃灰,日常也疏于维护,基本上是看都不看的状态,所以这次,关于这“历史的抉择”,我还是有必要好好记录一下!!

0x00 背景

Typecho是国内的一个经典、轻巧的开源博客系统。在10月底新版发布之前,已发布的正式版已经是很久没更新了,但就国内博客圈的使用率来说算是很有分量的一款程序,所以对此废话不多说。最近Typecho接连爆出2个严重漏洞!!使得很多站点受到影响,包括我也是(服务器都被日成筛子了!)

由于这次漏洞影响比较大,网上出现了不少关于漏洞的分析,其中也有一些阴谋论的推测(后来被证实是想多了,个人认为该文章作者并不是恶意揣测开发团队的意图,仅仅是沟通问题)。


①知道创宇漏洞分析文档:https://paper.seebug.org/424/
②核心开发者joyqi的回复:
V2EX: https://www.v2ex.com/t/401202
joyqi博客:https://joyqi.com/typecho/about-typecho-20171027.html
③某造成误解的文章:https://mp.weixin.qq.com/s/IE9g6OqfzAZVjtag-M_W6Q

0x01 发现与分析确认

因为我日常也不怎么管理腾讯云主机,基本上就是吃灰状态,偶尔续续费什么的。直到某天我续费的时候提示说服务器被传木马了,在Typecho网站目录下多了一个zz.php。如此明显,初步分析是技术爱好者的“友情检测”,非勒索/恶意入侵。

于是,首先查看服务器的安全策略,我记得上一次设置这个好像在买这台主机时候做的,之后就没再管过。结果看了一眼:

  • 内心OS:妈耶!!开放全部端口访问!!这TM的不明摆着要被日吗???!!

于是乎,马上删掉了安全策略,只留下开放22端口。随后,用winscp连接服务器,通过查询最后修改日期,发现网站根目录下有一个zz.php的一句话木马,而phpmyadmin目录下有一个cgi-149.php是被修改过。虽然数据库还在,但是很有可能已经被脱裤了,万幸的是我那个吃灰站点也没什么数据价值,对个人来说影响不大

不过接下来我担心的就是这个大马的提权程度,是否已经拿下Linux下的更高权限呢??我从腾讯云的控制台查看操作记录,显示:没有!!这就说明一定是被删记录了!!用putty连接到主机,查看最后执行命令,发现2个令人可悲的记录:

1
2
cat default.pass
mysql -u root -p

emmmm看来很有可能被脱裤了,因为在成功进行Linux提权之后一般是可以直接通过webshell来执行命令的,接下来要检查的是主机有没有异常登录:命令查看了以下日志:

  • /var/log/message
  • /var/log/secure

发现在最后修改日期之前的记录完全没有!!这说明是被清理痕迹了!!也解释了为什么腾讯云后台记录没有日志。由此可以判定:已经被提权,并且是较高权限,数据库被脱裤的可能性极大!!

但是即使这样也没办法确认入侵者到底有没有拿下服务器密码(比如新增一个用户并且给予root权限,这样所获得的权限等同于拿下root账户和密码)

但是通过命令

1
last -f /var/log/wtmp

发现之前没有异常登录!由于这个日志理论上是永久性记录的,所以可信度极高。又输入

1
cat /etc/group

发现也没有异常的用户/用户组,所以可以确定:对方只是成功提权,删了webshell之后他就没有权限了!而关于数据库的问题,反正没什么重要数据何况密码什么的都是程序自己生成的那些!所以并无太大影响!!

0x02 处理

这还能怎么处理?后话再说,这里就只做了应急处理!即:

  • 删除webshell
  • 重新配置服务器端口的安全策略

关于要不要开蜜罐这个问题,我觉得人家都那么明显的去提示你留下木马了,也仅仅是个友情检测,并非深仇大恨不至于开个蜜罐故意抓人。但这一次的经历是要当作教训的!!

0x03 后话

经历了这次被黑得最惨的“入侵”,基本上对动态网站无爱了,考虑到这台腾讯云主机的实际使用情况,计划直接重装然后拿来做测试和展示平台,也会搭建一些环境用于程序/漏洞测试,但为了在学校那边装个样子,应该会建个ghost站点作为展示站点。

关于这次经历,一方面感谢国内各大安全团队提供漏洞分析与解决建议,另一方面则是对Typecho开发团队及时提供解决方案表示感谢,毕竟这个圈子的维护,眼下也是越来越难了。

而对我自己来说,完全就像回到过去一样,这大概就是命运的“钦定”,让我回归一个纯粹的技术爱好者,涉足开发与运维,也要尝试一下CTF。

系统重置与hexo迁移

因为win10坑爹的自动更新忘关了!所以在不知不觉当中它就给我更新了,然而每次系统盘更新都很恶心,日常eclipse因为JDK环境(安装在C盘)迷之缺失不能用还好说,毕竟我不是Java开发者,但是这次竟然让Node.js环境给和谐了!!所以我相当于数据完全丢失!!!本来想关机过几天再搞,却发现这个系统有问题不能关机!!或者说关不了机!!那就呵呵了,利用win10唯一一个比较人性化的设置——重置电脑来实现近似重装系统(效果上完全一样)

就这样,我翘了一节课,花了10小时时间成功重置电脑,并且又花了4小时去清理磁盘(200G的旧文件),让电脑变得“崭新”,就关了win10自动更新,依次去装那些常用软件,这些就不具体说了,下面讲一下重头戏:

新电脑上hexo的迁移

首先!!安装Node.js环境并且

1
npm install -g hexo

这个过程可能会非常漫长,并且会“报错”:

1
npm WARN deprecated swig@1.4.2: This package is no longer maintained

实际上是网速太慢,仍然在自动安装!等就行了!一定要等待!一定要等待!一定要等待!直到提示安装成功!!当然如果速度真的受不了,可以改npm源为淘宝源,具体怎么做这里就不具体说了。

下一步,Git bash 进入你存放hexo的目录,提前将备份好的这几个文件粘贴到里面!!注意仅仅要这几个!其他都!不!要!

1
2
3
4
5
 _config.yml
package.json
scaffolds/
source/
themes/

之后

1
npm install

这里也只要等待!!接下来就可以按照之前使用hexo的方式来使用了,相当于迁移成功!!但是,这个时候部署,Git 会要求确认你的身份!这里按照GitHub上的信息来写就行了,命令如下:

1
2
3
git config --global user.email  "you@example.com"

git config --global user.name "Your Name"

之后

1
hexo deploy

会弹出一个GitHub的登录窗口,登录即可!因为这时你并没有之前的残余文档,即public文件夹,所以直接部署即可。

之后,去验证一下是否部署成功,如果网站更新正常,即认为hexo迁移成功!!

注意!!!如果再次出现node命令无法使用,重新配置系统环境变量即可!!

最后再给出2个hexo插件:hexo-tag-aplayerhexo-tag-dplayer

TERMUX上ssh、vim和渗透环境配置

关于termux就不用多说了,安卓上少有的神器,对于运维党来说算是必备品!!但是要注意这玩意儿的安装目录就是系统根目录!!所以会有很严重的权限限制!!对于一些操作要谨慎!!不然就只能清除数据了!!

  • 设备:Yoga Book

每次启动建议先更新源,同时升级软件包

1
2
apt update
apt upgrade

或直接

1
apt update && apt upgrade

其他常用命令如下:

1
2
3
4
5
6
apt install <package>         安装软件包
apt show <package> 显示软件包的信息
apt list [--installed] 列出所有(或已安装)的软件包信息
apt remove <package> 删除软件包
chmod 修改文件权限
chown 修改文件归属

为了一次性直接装了所有要安装的包,如安装package1~3这3个包,可以用这个命令,就是并列之后加-y:

1
apt install <package1> <package2> <package3> -y

由于是Linux模拟终端,完全按Linux的套路来就行,国内网慢可以改用清华的源,大部分使用方法在termux官网上都有教程(英文),所以具体的这里就不多说了。演示日常装逼,使用cmatrix命令(前提是你装好了这个命令)

1
apt install cmatrix

同样的,装逼还有一个命令sl,怎么安装和运行完全同上。至于美化可以用zsh,但是我这个平板就比较方便,不需要这个了。感兴趣可以具体参考zsh的wiki

配置ssh

为什么要配置ssh?因为yoga book作为我的主力平板(实际上是嫌15.6的Acer太重了),在日常当中一直充当超级本(即使它是Android系统,但是超薄超轻真的方便太多!!)用于技术演示和应急维护,作为运维的一员,自然不必说ssh的重要性,配置ssh所实现的功能有2个:

  • 使用yoga book上的termux连接到服务器终端
  • 使用其他终端连接到termux终端

先说第一个,以阿里云/腾讯云为例,可以在官网的控制台查看外网ip,当然我绑定域名之后直接ping一下域名更方便

1
ping -c 1 https://liefeng.github.io

这样获取返回的外网ip,可以使用termux通过ssh连接主机终端。首先,termux安装sshd

1
apt install sshd

之后像使用putty一样连接主机终端就可以了,如以root账户连接ip为127.0.0.1的主机终端:

1
sshd 127.0.0.1 -lroot

这样的好处是对于我这种只能带着安卓平板(yoga book)到处跑的人来说,随时可以连接到主机进行配置/维护,同时也意味着远程连接着一台真·Linux主机,在某些时候能弥补Android平台限制的技术问题。

关于第二个,实际上对我来说没啥用。为了方便其他终端也能管理termux终端(实际上是因为安卓手机编程太蛋疼了!),在安装openssh之后使用JuiceSSH连接termux终端,电脑端可以用xshell连接(可以本地连接本地,毕竟Android手机用这个很麻烦,当然我yoga book自带灵光键盘不存在这个问题哦!),之后使用JuiceSSH提取密钥,毕竟termux不支持账户密码验证!!当然连接时注意端口!termux的ssh端口默认是8022,当然可以先自己查看一下!
安装openssh:

1
apt install openssh

查看sshd服务端口:

1
netstat -ntlp |grep sshd

当然openssh也是支持通过ssh连接其他终端的,语法为:

1
ssh 用户名@主机地址

配置vim
关于这里就完全是Linux配置vim的套路了,所以我真的不想写些什么了,毕竟用Google搜索任一“Linux+vim配置”的文章都比我写得好,写得全面!何况相对于vim本身,配置开发环境更为重要!毕竟vim配置的目的还是作为IDE来用。这里,说一下termux上所集成的语言包和其他必要包:

1
2
3
4
5
6
7
8
9
10
11
12
python         默认安装的是Python3
python2 这个才是python2.7
clang 大名鼎鼎的c++ 编译器
vim 这个就不用多少了,termux自带的是vi
git 这个码农都懂的
htop 任务管理器
tree 目录树
make 这个很重要,如果安装第三方包的话
irssi irc客户端,命令行聊天软件
wget 更不用说了
openssl ssh,这个之前说过了
tar 想必这个也不用多说

总之,有什么需要的直接输入

1
apt list

就可以了,对着列表安装自己所需要的。回到VIM配置的问题,如果你需要配置vim,只需在Home目录创建一个~/.vimrc文件即可以配置vim了,然而termux的vim自带该文件,就是配置写入有点问题(实际上还是权限问题!何况我是x86!!)所以既然对我来说足够用,那么就不多说了,具体建议参考这篇文章:
https://github.com/yangyangwithgnu/use_vim_as_ide

配置渗透环境

这里为了图方便,直接把所有基础包直接安装,大小约122MB。如果你的termux是第一次使用,可以直接复制我的安装命令:

1
apt install git wget vim nano tar less nmap openssh hydra python2 -y

nmap,openssh,hydra算是环境的一部分,具体怎么用问Google。之后就是安装其他的环境包:BBScan,subDomainsBrute,RouterSploit,whatportis和sqlmap,具体怎么用依然问Google,总之安装玩就算环境搭建成功,用法问Google!!!
安装sqlmap,BBScan,subDomainsBrute和RouterSploit;提示缺失python扩展包,直接用

1
pip2 install <对应扩展包>

1
2
3
4
5
git clone https://github.com/sqlmapproject/sqlmap.git
git clone https://github.com/lijiejie/BBScan.git
git clone https://github.com/y1ng1996/lijiejie_subDomainsBrute.git
git clone https://github.com/reverse-shell/routersploit
pip2 install requests

再安装whatportis

1
pip2 install whatportis

这样一个基础的渗透环境就配置好了,起码比N年前那种所谓Android渗透包(基本上都要root才能用)要好!!至于用法有不会的就Google!!有不会的就Google!有不会的就Google!重要的事情说三遍!!总之熟能生巧!!!

Linux下机器学习开发环境的配置

关于这个环境,我是准备拿来做计算的,毕竟搞工业仿真,如果一直在本机上测试那么我电脑直接捐了算了!!何况让服务器一直吃灰成何体统!!毕竟是已经续费到毕业的!不得不用!!

  • 设备:阿里云ECS
  • 执行终端:YogaBook(基于termux模拟终端)、Windows10

首先去下载Anaconda2,因为我的ECS是在青岛机房,而众所周知的一些原因,从官网上下载会导致速度特别特别慢,这个时候推荐从清华大学的镜像源下载。由于使用python2.7,就下载对应的Anaconda2-5.0.1。

如果你不确定选择什么版本,可以先查看一下系统信息

1
uname -a

我选择Anaconda2-5.0.1-Linux-x86_64.sh。并且创建一个Anaconda目录用于存放下载和安装,当然你也可以下载到根目录。

cd 到Anaconda目录,执行下载,不得不说国内的源下载速度是非常快的!!35mb/s

1
wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda2-5.0.1-Linux-x86_64.sh

下载好之后执行安装,整个过程就是按几下Enter,输入几次yes。如果你的命令行卡在下载命令上了,记得先退出再安装!

1
bash Anaconda2-5.0.1-Linux-x86_64.sh

安装完之后记得添加环境变量!实际上安装过程中会自己问,可以选择yes

之后就是检测一下能不能用,输入python看是否能返回python。但是输入conda、jupyter一类的却返回command not found,解决方法是把anaconda2/bin这个目录添加到环境变量就好了(具体操作看安装目录,默认安装目录是在~下)

1
echo 'export PATH="~/anaconda2/bin:$PATH"' >> ~/.bashrc

更新path以立即生效

1
source ~/.bashrc

这时再输入那些命令就可以执行了!因为深度学习环境需要一些开源模块,尤其是依托于Scikit-Learn,这时候就需要自己手动去安装了,可以使用pip或者conda。当然Numpy ,Scipy ,Matplotlib这些包也是必须的!!剩下的包就随用随加。

1
2
3
4
5
6
7
conda install scipy
conda install theano
conda install keras
pip install tensorflow
pip install sklearn
pip install numpy
pip install matplotlib

但是还有一个问题是Anaconda官网因为众所周知的原因国内访问慢的要死,这个时候还是改用国内的源更方便一些!!

添加Anaconda的TUNA镜像

1
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

设置搜索时显示通道地址

1
conda config --set show_channel_urls yes

这个时候可以考虑配置jupyter了,首先要测试一下环境

1
jupyter notebook

环境没问题就先来配置ipython,输入:

1
ipython profile create

然后

1
cd ~/.ipython/profile_default/

对生成的2个文件进行编辑,使用方法是先键入

1
c = get_config()

再查找到c.InteractiveShellApp.exec_lines语句,在[]里键入常用的模块,我以自己的为例

1
"import pandas as pd","import numpy as np","import scipy.stats as spstats", "import scipy as sp"

因为过多的导入会影响ipython的开启速度,这里就自己斟酌吧。

接下来,为了能够远程访问我这台ECS上的jupyter notebook,要进行最恶心的设置了。首先,为了保证能够完美设置,确认写入path环境之后重启ECS,之后,输入

1
jupyter notebook --generate-config

而root会报错,要求加入-allow-root再执行,所以

1
jupyter notebook --generate-config --allow-config

执行成功会显示:

1
Writing default config to: /root/.jupyter/jupyter_notebook_config.py

反之报错,重复上述步骤直至成功,一般重启服务器即可。既然生成了配置文件,接下来设置个密码,为了方便起见建议用ipython手动设置!!即先输入

1
ipython

进入ipython,然后配置自己的密码

1
2
3
4
In [1]: from notebook.auth import passwd
In [2]: passwd()
Enter password:
Verify password:

回车,之后会返回一串密文,即Out[2]:那个。这个时候配置jupyter_notebook_config.py

1
vim jupyter_notebook_config.py

找到,去掉注释#,然后按自己情况编辑

1
2
3
4
c.NotebookApp.ip='*'
c.NotebookApp.password = u'sha:ce...刚才复制的那个密文'
c.NotebookApp.open_browser = False
c.NotebookApp.port =8888 #可自行指定一个端口, 访问时使用该端口

因为这个文件大概600+行代码,建议用:?keyword 来查找。之后在非隐藏目录,启动jupyter notebook

1
jupyter notebook

若是root用户,则执行

1
jupyter notebook --allow-root

然后ip:端口号即可使用jupyter,实际上域名:端口号也可以。记得在安全组的公网入方向添加这个端口

但是这样又爆出了一个严峻问题,就是我是用root用户的,而jupyter是整个服务器的目录都能读取并且按照操作用户的权限来执行,所以一旦密码被破解我的服务器就会被日!!!因此要考虑一下安全问题:

  • 不到用的时候不要开启jupyter
  • 设置超级复杂的密码
  • 第三方安全软件监视端口

浅谈暴力web攻击

关于这个傻逼问题还是和阿里云有关。因为web应用防火墙,后台总是会看到一些“奇奇怪怪”的攻击记录,其中最多的就是脚本木马、上传漏洞类型的暴力攻击。

  • 首先看一下我的服务器安全组配置:公网出全部端口,公网入21/22/80/443端口
  • 其次,统计一下请求方式:POST、PUT、GET
  • 没有发现有CSRF攻击的记录

从上面的信息可以看出端口限制基本上是死的,对于80端口入侵,可行性最高的就是跑GCI,使用比较无脑的GCI扫描器进行穷举。对于21/22端口入侵,FTP就算了,我服务器上FTP服务是死的。而22端口,除非拿下我的账户密码直接ssh,否则入侵成功的几率是不存在的!443就算了。

那么从HTTP协议来看,实际的安全性如何:

  • GET (选择):从服务器上获取一个具体的资源或者一个资源列表。
  • POST (创建): 在服务器上创建一个新的资源。
  • PUT (更新):以整体的方式更新服务器上的一个资源。

关于具体的就不说了,实际应用当中都是一些嗅探手段,用于垃圾扫描。毕竟当下做SQL注入也是特别难的。从日志里看,这类请求无非是检测是否存在某目录文件。但是这一引出了一个大的问题——漏洞利用。HTTP协议,win10下可以使用telnet命令(在系统中手动开启这个命令才能用)。更具体的说明详见从入侵者的眼中去理解 http 协议

如上所述,从注入角度看基本上是攻不进来的,但是一旦自身内部有问题,存在漏洞就不好说了。关于漏洞影响这里不多说,而且给出的建议也很简单却很难做好:

  • 合理配置服务/端口与权限
  • 关注安全信息,及时更新软件,打补丁
  • 使用第三方高效的服务器安全软件

搭建本地git仓库

centos搭git仓库很别扭,而且….虽然是为了技术验证,但讲道理这个不如QQ群的群共享好用(如果是短期项目的话)

  • 设备:阿里云ECS(吃灰中)

首先通过yum源下载安装git

1
yum install -y git

安装之后会在/home/目录下生成一个git目录,但相关操作之后再说。首先添加个用户(这里用户名为git),并且为之设置密码

1
2
adduser git
passwd git

下一步,我们在/home/git/目录下建立一个子目录,作为git仓库目录。因为是给美赛准备的,我这里就是mcm

1
mkdir /home/git/mcm

接下来给予用户组和775权限:

1
2
sudo chown git:git /home/git/mcm
sudo chmod 755 /home/git/mcm

到这一步,基本上就配置完了,接下来切换到git用户组,在mcm目录下创建仓库即可

1
2
su git
cd /home/git/mcm

这里我建立一个仓库名为mcm的仓库

1
git init --bare mcm.git

至此,git仓库搭建与配置结束(结束了??是我懒得搞那些没用的权限设置,尤其是我习惯用shell!!何况用ssh来使用对我的队友极其不方便!!),马上打开git bash验证一下:

1
git clone git@ECS的ip:/home/git/mcm/mcm.git

输入yes之后,返回

1
warning: You appear to have cloned an empty repository.

到这里一切都ok了,虽然感觉使用起来然并卵。关于上传项目参考git上传仓库(感觉这样给队友用只会给她们增加压力XD)。当然,如果你是作大型的自建仓库使用,建议用Gogs或者GITLAB,当然我这里自用就用不着这么上纲上线的程序了。