月度归档:2021年08月

Win10 20H2 内置账户重命名引起的 bug 全纪录

2020 年 10 月,按照 Win10 半年滚动更新的惯例,微软推出了 Windows 10 20H2 。谁能想到,这次更新隐藏了一个和我的使用习惯有关的 bug 。

在半年滚动更新后第一时间就进行升级这种操作这些年有过多次,感觉都挺稳,这次也应该不会有什么问题。于是给自己的工作电脑、家里的娱乐电脑都升了 20H2,升级完成后还非常自信地通过磁盘清理删掉了旧系统备份……

后来的偶然之间,进入 “本地用户和组” 之后立即出现了重大问题——“系统将在一分钟之后重新启动”,此时系统的关键功能包括重启或关机都不可用,只能等一分钟后自动重启。

类似于这样的提示

冷静下来一想,如果是 20H2 升级过程本身的固有问题,那么应该是个极其恶性的 bug,早就全网炸锅了吧?为什么只有我自己的几台升过级的 PC 出现了类似问题呢?(这个时候偏偏忘记了事件查看器)

从 “动了什么引起问题” 很容易想到自己有个习惯:把系统内置的 “Administrator” 账户通过组策略重命名为 “Admin” 以便局域网内共享访问。 Google 搜 “win10 20h2 Administrator rename crash” 等关键词,最终找到了这篇文章,是由于系统关键进程 lsass.exe 崩溃引起的强制重启。文章提到,通过事件查看器可以看到 lsass.exe 的崩溃记录。微软还事后诸葛亮说,在升级 20H2 前应该把系统内置账户 “Administrator” 和 “Guest” 都重命名回本来面目,已经升级的请赶快滚回回滚原来的版本。之后,Win10 易升的升级检查策略也作出了更新,检测到内置账户被重命名会拒绝升级。

后来,微软在这篇文章中阐明了问题产生的原因,大意是 Win10 20H2 升级程序如果遇到 Administrator 被重命名成别的,比如 Admin,(大概会错误地认为 Administrator 不存在)而创建新的 Administrator 账户,这个新的 Administrator 的 SID(安全标识符)和 RID 和原来的 Admin 是一模一样的,而 Windows 本地账户的 SID 原本的设计是独一无二的,以上情况会让 lsass.exe 懵逼继而崩溃,没有了安全大管家 lsass.exe 的 Windows 只能用给用户一分钟的时间然后强制重启。还记得震荡波病毒么?

问题定位了,那怎么解决这个问题?干等到 11 月的 patch Tuesday,微软发布了 KB4586781,结果竟然是屏蔽 “本地用户和组” 中的内容,感觉是临时措施保住 lsass.exe 不崩溃,而后一直都没有实际解决上述冲突问题。

我试了从系统其他任何地方,包括新的 Windows 设置界面、 powershell 、甚至 PE 的密码破解器等都动不了这俩 “Administrator 问题户”,无法解决这个问题。

微软的这篇文章后来更新了(如下图),说他们终于解决了这个问题,意思是在升级过程中不会再犯这个错误,易升的限制措施也随之取消了。然而已经出现问题的用户怎么办,咱也不知道,咱也不敢问。最后的最后怎么解决的?我重装了。

顺便,这里写错了。根据时间线不难得出 2020 年 10 月出的问题应该在 2021 年初解决,所以这里应该是 January 7, 2021,微软还真是越过越回去了。

SQLmap 参数 eval 的使用

上个月底,7 月 24 日,恰逢台风烟花来袭,在家无事就和公司网安组大佬一起在 Cybrics2021 线上 CTF 赛打了个酱油。 Web 类有一道叫 announcement 的题目,题干很简单,只有输入邮箱这一个步骤。 burpsuite 抓包看了下,POST 了 “email” 和 “digest” 两个参数到后台。

借个图

那么这会不会是一道注入题呢。把 email 参数换为单引号,看了下 digest 长度有点像 md5,于是本地计算单引号的 md5 后填入 digest,果然返回了数据库报错信息——嗯,报错型注入没跑了。

其实后来网上的 writeup,有的用 python 脚本来做,有的边计算 md5 边手工注入。但是遇到注入题,大名鼎鼎的入狱拖库工具 SQLmap 怎能缺席。这道题最大的问题是 digest 参数必不可少,并且必须是和 email 参数的 md5 hash 相匹配。

想到处理 SQLi payload 自然首先想到 tamper 库。翻了翻 SQLmap 的自带 tamper 库,空格变换、双写 SQL 关键词之类,之前也尝试过改写一些 tamper,但和本题相距有点远。于是在 Google 一阵搜索后,非常意外地发现--eval 这个参数很好用——简而言之就是直接用 python 代码来处理注入 payload 。一番调试后,用*指定 payload 位置为 email 参数,--eval 来处理 digest,最终使用以下命令跑了几百条后拖出了含有 flag 的表。

sqlmap -u "http://announcement-cybrics2021.ctf.su/" --data "email=*" --eval="import hashlib;digest=hashlib.md5(email.encode('utf-8')).hexdigest()"

一开始对--eval 运算后生成的字符串在 POST 请求参数的位置有些不解,后来经实践发现--eval 产生的 digest 参数会自动附在 --data"email="的后面。

好的 CTF 赛题,理应让人对熟悉的工具有新的认知和进一步的思考。