Openwrt漏洞挖掘之小米路由

转载摘录了原文的内容,但是有格式兼容性问题,更好的排版格式详见原文:https://www.open-open.com/news/view/c6ec6b

本文是通过小米路由作为案例,讲解如何挖掘openwrt的漏洞,并且通过一个小米路由的0day作为实例,让大家更容易理解测试的方法。

1 提取固件内容

首先肯定是将固件中文件系统的内容提取出来,然后对其进行分析,也可以是分析其固件中应用程序是否存在漏洞,如Uhttpd等服务,也可以分析其web程序是否存在漏洞 如openwrt,由于本人对二进制并不熟悉,所以此次的内容就是针对openwrt luci的。

1.1 固件解包

通过执行Binwalk可以发现存在如下内容:

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(253, 253, 249); text-decoration-style: initial; text-decoration-color: initial;">root@kali:~/miwifi# binwalk brcm4709_r2d_all_79e11_2.8.19.bin

DECIMAL HEXADECIMAL DESCRIPTION

672 0x2A0LZMA compressed data,properties: 0x5D,dictionary size: 65536bytes,uncompressed size: 90046464bytes
30048716 0x1CA81CCTRX firmware header,little endian,image size: 3047424bytes,CRC32: 0xA85FDFF0,flags: 0x0,version: 1,header size: 28bytes,loader offset: 0x1C,linux kernel offset: 0x0,rootfs offset: 0x0
30048744 0x1CA81E8LZMA compressed data,properties: 0x5D,dictionary size: 65536bytes,uncompressed size: 5902752bytes</pre>

通过加上-e参数对其进行解压,解压之后将会得到一个目录,进去查看之后内容如下:

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(253, 253, 249); text-decoration-style: initial; text-decoration-color: initial;">root@kali:~/miwifi# cd _brcm4709_r2d_all_79e11_2.8.19.bin.extracted/
root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted# ls
1CA81E8 1CA81E8.7z 2A0 2A0.7z
root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted# file 2A0
2A0:UBI image,version1
root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted# file 1CA81E8
1CA81E8:data
root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted#</pre>

1.2 提取文件系统

与其他不同的是,miwifi使用的是UBI的文件系统,这个文件系统挂载起来比较麻烦,在尝试了无数次之后发现一个自动化就能挂载的脚本

https://github.com/jrspruitt/ubi_reader 安装方式:

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(253, 253, 249); text-decoration-style: initial; text-decoration-color: initial;">sudo apt-getinstall liblzo2-dev sudo apt-getinstall python-lzo
git clone https://github.com/jd-boyd/python-lzo.git cd python-lzo
$ python setup.py install</pre>

通过执行

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(253, 253, 249); text-decoration-style: initial; text-decoration-color: initial;">ubireader_extract_images2A0</pre>

可以得到如下结果

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px; font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; background-color: rgb(253, 253, 249); text-decoration-style: initial; text-decoration-color: initial;">root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted# ubireader_extract_images 2A0
root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted# ls
1CA81E8 1CA81E8.7z 2A0 2A0.7z ubifs-root
root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted#
root@kali:~/miwifi/_brcm4709_r2d_all_79e11_2.8.19.bin.extracted/ubifs-root/2A0# ubireader_extract_files img-1883837156_vol-system.ubifs
Extractingfiles to:ubifs-root</pre>

将会生成一个名叫 ubifs-root 的文件夹里面还存放这一个文件,这个文件就是ubi镜像的最终文件,在通过ubireader_extract_files对其进行提取即可,最后生成的文件夹,其中就存放的该固件的文件系统。

2 Openwrt的简单介绍

OpenWrt 可以被描述为一个嵌入式的 Linux 发行版,(主流路由器固件有 dd-wrt,tomato,openwrt三类)而不是试图建立一个单一的、静态的系统。OpenWrt的包管理提供了一个完全可写的文件系统,从应用程序供应商提供的选择和配置,并允许您自定义的设备,以适应任何应用程序。

对于开发人员,OpenWrt 是使用框架来构建应用程序,而无需建立一个完整的固件来支持;对于用户来说,这意味着其拥有完全定制的能力,可以用前所未有的方式使用该设备。

以上内容来自百度百科

Openwrt是一个支持用Lua进行开发嵌入式的linux路由系统,详细的内容就不说了,就简单说一下,基本在openwrt都是使用lua进行开发的,其中lua的目录结构大概如下

所有的lua模块和web调用的lua程序都在这个目录下面:

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">/usr/lib/lua/
/usb/lib/lua/luci#这里存放的就是luci也就是openwrt web访问所需的内容。</pre>

openwrt在开发的时候 基本上是MVC模式,既 Model,View,Controller,所以大家看下图就可以一目了然

Openwrt漏洞挖掘之不要用小米路由偷偷下小电影哦

Controller目录中存放的就是所有走web访问的入口文件,Model中放的就是一些所需要的模块,View就是html模板。

3 寻找漏洞

寻找漏洞的第一步自然是寻找一些高风险的漏洞,首先需要的就是查找出不需要登录就可以调用的模块,首先我们来看一个Contraller是怎么写的文件位置:/usb/lib/lua/luci/controller/diagnosis/index.lua

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">module("luci.controller.diagnosis.index", package.seeall)
functionindex()
localroot=node()
if notroot.targetthen
root.target= alias("diagnosis")
root.index= true
end
localpage=node("diagnosis")
page.target=firstchild()
page.title=("")
page.order= 110
page.sysauth= "admin"
page.mediaurlbase= "/xiaoqiang/diagnosis"
page.sysauth_authenticator= "htmlauth"
page.index= true
entry({"diagnosis"}, template("diagnosis/home"),
("首页"), 1, 0x09)

entry({"diagnosis", "wanerr"},call("action_wanerr"),(""), 2, 0x09)
entry({"diagnosis", "errindex"},call("action_errindex"),
(""), 3, 0x09)
end

functionaction_wanerr()
localresult= {}
result["code"] = 0
result["data"] = {
["a"] =("对不起,小米路由器出现网络连接问题无法打开网页"),
["b"] =
("1、请检查网线是否正确连接路由器WAN口上"),
["c"] =("2、请检查网线是否损坏"),
["d"] =
("3、请检查路由器WAN口是否损坏"),
["e"] =_("小米路由器技术支持")
}
luci.http.write_json(result)
end

functionaction_errindex()
localresult= {}
result["code"] = 0
result["data"] = {
["a"] =("对不起,小米路由器出现网络连接问题无法打开网页"),
["b"] =
("立即进行网络诊断"),
["c"] =_("小米路由器技术支持")
}
luci.http.write_json(result)
end</pre>

其中最为关键的一个内容便是

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">entry({"diagnosis", "wanerr"},call("action_wanerr"),_(""), 2, 0x09)</pre>

这一段的意思就是,我通过访问

<pre style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">http://127.0.0.1/cgi-bin/luci/diagnosis/index/wanerr</pre>

就可以调用action_wanerr 函数,然后0x09就是一个权限标志位,经过多次摸索发现0x9,0x01,0x0d的标志位是不需要登录就可以访问的。那我们就先查找出所有0x09,0x08,0x0d标志位的文件,如下

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">api/misystem.lua:33:entry({"api", "misystem", "topo_graph"},call("getTopoGraph"), (""), 114, 0x0d)
api/xqsystem.lua:61:entry({"api", "xqsystem", "upgrade_status"},call("upgradeStatus"), (""), 148, 0x0d)
api/xqsystem.lua:73:entry({"api", "xqsystem", "cancel"},call("cancelUpgrade"), (""), 160, 0x0d)
api/xqsystem.lua:123:entry({"api", "xqsystem", "flash_permission"},call("flashPermission"), (""), 200, 0x0d)
web/index.lua:74:entry({"web", "upgrading"}, template("web/syslock"),("路由升级"), 101, 0x0d)
web/index.lua:81:entry({"web", "topo"}, template("web/topograph"),
(""), 130, 0x0d)
api/xqnetwork.lua:90:entry({"api", "xqnetwork", "wan_link"},call("getWanLinkStatus"), (""), 265, 0x09)
api/xqnetwork.lua:104:entry({"api", "xqnetwork", "pppoe_catch"},call("pppoeCatch"), (""), 264, 0x09)
api/misystem.lua:91:entry({"api", "misystem", "lsusb"},call("lsusb"), (""), 150, 0x09)
api/misystem.lua:97:entry({"api", "misystem", "r_ip_conflict"},call("rIpConflict"), (""), 155, 0x09)
api/misystem.lua:99:entry({"api", "misystem", "tb_info"},call("toolbarInfo"), (""), 156, 0x09)
api/xqsystem.lua:13:entry({"api", "xqsystem", "init_info"},call("getInitInfo"), (""), 101, 0x09)
api/xqsystem.lua:14:entry({"api", "xqsystem", "fac_info"},call("getFacInfo"), (""), 101, 0x09)
api/xqsystem.lua:133:entry({"api", "xqsystem", "set_payment_info"},call("setPaymentInfo"), (""), 207, 0x09)
api/xqsystem.lua:134:entry({"api", "xqsystem", "sign_order"},call("signOrder"), (""), 208, 0x09)
diagnosis/index.lua:16:entry({"diagnosis"}, template("diagnosis/home"),("首页"), 1, 0x09)
diagnosis/index.lua:18:entry({"diagnosis", "wanerr"},call("action_wanerr"),
(""), 2, 0x09)
diagnosis/index.lua:19:entry({"diagnosis", "errindex"},call("action_errindex"),(""), 3, 0x09)
dispatch/index.lua:17:entry({"dispatch"}, template("index"),
("跳转"), 1, 0x09)
web/index.lua:26:entry({"web", "logout"},call("action_logout"), 11, 0x09)
web/index.lua:41:entry({"web", "init", "hello"},call("action_hello"),("欢迎界面"), 14, 0x09) --不需要登录
web/index.lua:42:entry({"web", "init", "agreement"}, template("web/init/agreement"),
("用户协议"), 14, 0x09) --不需要登录
web/index.lua:43:entry({"web", "init", "privacy"}, template("web/init/privacy"),("用户体验改进计划"), 14, 0x09) --不需要登录
web/index.lua:76:entry({"web", "webinitrdr"},call("action_webinitrdr"),
(""), 110, 0x09)
web/index.lua:79:entry({"web", "ieblock"}, template("web/ieblock"),(""), 120, 0x09)
api/xqpassport.lua:12:entry({"api", "xqpassport", "login"},call("passportLogin"), (""), 401, 0x01)
api/xqpassport.lua:14:entry({"api", "xqpassport", "rigister"},call("routerRegister"), (""), 405, 0x01)
api/xqpassport.lua:15:entry({"api", "xqpassport", "binded"},call("getBindInfo"), (""), 406, 0x01)
api/xqnetdetect.lua:12: --entry({"api", "xqnetdetect", "wan_status"},call("getWanStatus"),
(""), 351, 0x01)
api/xqnetdetect.lua:13:entry({"api", "xqnetdetect", "sys_info"},call("getSysInfo"), (""), 352, 0x01)
api/xqnetdetect.lua:14:entry({"api", "xqnetdetect", "ping_test"},call("pingTest"), (""), 353, 0x01)
api/xqnetdetect.lua:15:entry({"api", "xqnetdetect", "detect"},call("systemDiagnostics"), (""), 354, 0x01)
api/xqnetdetect.lua:16:entry({"api", "xqnetdetect", "sys_status"},call("systemStatus"), (""), 355, 0x01)
api/xqnetdetect.lua:19:entry({"api", "xqnetdetect", "nettb"},call("nettb"), (""), 359, 0x01)
api/misns.lua:12:entry({"api", "misns", "prepare"},call("prepare"), (""), 201, 0x01)
api/misns.lua:17:entry({"api", "misns", "sns_init"},call("snsInit"), (""), 206, 0x01)
api/misns.lua:21:entry({"api", "misns", "authorization_status"},call("authorizationStatus"), (""), 210, 0x01)
api/xqsystem.lua:17:entry({"api", "xqsystem", "system_info"},call("getSysInfo"), (""), 104, 0x01)
api/xqsystem.lua:32:entry({"api", "xqsystem", "get_languages"},call("getLangList"), (""), 118, 0x01)
api/xqsystem.lua:33:entry({"api", "xqsystem", "get_main_language"},call("getMainLang"), (""), 119, 0x01)
api/xqsystem.lua:45:entry({"api", "xqsystem", "passport_bind_info"},call("getPassportBindInfo"), (""), 132, 0x01)
api/xqsystem.lua:60:entry({"api", "xqsystem", "flash_status"},call("flashStatus"), (""), 147, 0x01)
api/xqsystem.lua:86:entry({"api", "xqsystem", "device_mac"},call("getDeviceMacaddr"), (""), 173, 0x01)
service/cachecenter.lua:11:entry({"service", "cachecenter", "report_key"},call("reportKey"),(""), nil, 0x01)
service/datacenter.lua:34:entry({"service", "datacenter", "media_delta"},call("mediaDelta"),
(""), nil, 0x01)
service/datacenter.lua:35:entry({"service", "datacenter", "media_metadata"},call("mediaMetadata"),(""), nil, 0x01)
service/datacenter.lua:36:entry({"service", "datacenter", "share_miui_dir"},call("shareMiuiBackupDir"),
(""), nil, 0x01)
service/datacenter.lua:37:entry({"service", "datacenter", "get_file_list"},call("getFileList"),(""), nil, 0x01)
service/datacenter.lua:38:entry({"service", "datacenter", "get_storage_info"},call("getStorageInfo"),
(""), nil, 0x01)
service/datacenter.lua:39:entry({"service", "datacenter", "get_youku_status"},call("getYoukuStatus"),(""), nil, 0x01)
service/datacenter.lua:40:entry({"service", "datacenter", "bind_youku_appid"},call("bindYoukuAppid"),
(""), nil, 0x01)</pre>

先选择几个重点的模块看一下,如:xqsystem,datacenter, misystem先选择第一个来查看一下:通过如下内容:

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">api/misystem.lua:33:entry({"api", "misystem", "topo_graph"},call("getTopoGraph"), (""), 114, 0x0d)</pre>

得知,可以通过访问 http:///cgi-bin/luci/api/misystem/topo_graph 来调用getTopoGraph,可以去看一下getTopoGraph函数的内容,

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">functiongetTopoGraph()
local XQTopology = require("xiaoqiang.module.XQTopology")
localresult= {
["code"] = 0
}
localsimplified=tonumber(LuciHttp.formvalue("simplified")) == 1 and true or false
localgraph=simplifiedand XQTopology.simpleTopoGraph() or XQTopology.topologicalGraph()
result["graph"] =graph
result["show"] =graph.leafsand 1 or 0
LuciHttp.write_json(result)
end</pre>

发现函数中也没有做任何验证,进行访问即可得到如下信息

Openwrt漏洞挖掘之不要用小米路由偷偷下小电影哦
Openwrt漏洞挖掘之不要用小米路由偷偷下小电影哦

在测试其他的模块也有一些信息泄漏的漏洞,

Openwrt漏洞挖掘之不要用小米路由偷偷下小电影哦
Openwrt漏洞挖掘之不要用小米路由偷偷下小电影哦

其中比较严重的漏洞是下面这个,可以获取这个用户使用离线下载的文件列表,函数如下:

<pre class="brush:java;toolbar: true; auto-links: false;" style="box-sizing: border-box; font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; font-size: 14px; margin: 1.5em 0px; overflow: auto; display: block; color: rgb(33, 37, 41); position: relative; max-width: 750px;">functiongetFileList()
localpayload= {}
payload["api"] = 3
payload["path"] = LuciHttp.formvalue("path")
payload["sharedOnly"] = true
tunnelRequestDatacenter(payload)
end</pre>

看内容应该是获取path下目录,但是也做了校验,并不能跳出其设置的用户目录,但是比如我们获取了下面这位用户,看到他下了一些小电影,什么黑丝豹纹,都是什么意思哦

Openwrt漏洞挖掘之不要用小米路由偷偷下小电影哦
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339