网管小贾 / sysadm.cc
初春,乍暖还寒,心情不错的我哼着小曲踱进了卫生间。
正当我吹着口哨带薪放松的时候,忽然收到老板的消息,说是服务器无法登录了。
特么搞什么灰机?没见我正忙着呢嘛!
我急忙抖动了两下,一边忿忿不平,一边小步快走,现在的春天还是挺冷的啊!
搞慢了又得挨老板骂,我立马回到工位,熟练地打开了 Putty ,一顿噼里啪啦输入用户名和密码,回车走起!
哎呀我去,我眼镜滑了一下,还真是无法登录哈!
密码是多少来着?
一连试了好N多次都失败了,我心里开始有点发毛......
系统运行倒是一切正常,就是密码怎么也不正确!
难道被黑了?不可能啊!
所有记得的密码都试了个遍,都不对,实在是想不起来还能有什么密码了。
这时突然想起来,为了往服务器里传数据,我还用过 WinSCP 连接过服务器,那上面还保存着密码呢!
嘿嘿,想在这儿,我立马打开了 WinSCP ,太好了,密码还真保存着呢!
尝试登录了一下,果然成功登录服务器,看来保存的密码是OK的!
只是如果调用 Putty ,还是要你输入密码才行,这可怎么办?
再这样下去可不行,时间紧迫,于是我马上上网看看有没有啥好办法。
哎,没想到哈,网上关于解密 WinSCP 会话密码的文章还挺多。
不过这些文章都指向了一个叫作 winscppasswd 的程序,于是我最后找到了它在 GitHub 上的同名项目。
https://github.com/anoopengineer/winscppasswd
winscppasswd 是 WinSCP Password Extractor/Decrypter/Revealer 的缩写,意为 WinSCP 解密工具,以命令行形式运行。
WinSCP 存储的会话中有以加密形式保存的密码,通常这些会话保留在注册表中。
而这款小工具 winscppasswd 就是当你遗忘会话密码时,可以帮助你唤醒记忆,最后将密码找回来。
而这款工具的作者制作它的初衷显得非常幽默搞笑,他说是为了不断地忘记曾经保存过的密码而编写的。
大神不仅仅只有幽默,而且做起事来也非常严谨可靠,他不太信任那些从互联网上下载下来的未知来源的工具,因此大神自己亲力亲为打造了这款工具。
大神也是人,我猜他肯定也是被广告、木马啥的给整怕了,不过正好,我们这些小白也从中受益,有幸一睹风采,一起学习学习。
winscppasswd 是用 Golang 编写的,如果你是学过 Go 语言的小伙伴,那么你就可以直接上手了。
不过我对 Go 来说是七窍通了六窍,一窍不通。
还好作者已将现成的命令打包并提供给我们下载,那我就先下载下来试用试用吧。
好了,下载完毕,直接运行 winscppasswd.exe 会给出如下提示。
WinSCP stored password finder Open regedit and navigate to [HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions] to get the hostname, username and encrypted password
Usage winscppasswd.exe <host> <username> <encrypted_password>
根据这些提示,再加上 GitHub 项目页上的使用步骤介绍,最后明白了它的使用方法。
大概的意思是,先到注册表中找到相应会话的注册表项,获取到其中的主机名、用户名和加密密码,然后再用这个 winscppasswd 加上参数这么一执行,密码就给解出来了。
真的这么神吗,试试就试试,咱们说干就干!
我按照提示,果然找到了注册表项中保存的会话。
HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions
我们赶紧拿保存的服务器会话信息记录下来测试吧。
根据前面命令提示的语法,再按上面的配置,那么我们写命令就可以像下面这样。
# host: 主机名# username: 用户名# encrypted_password: 加密的密码# winscppasswd.exe <host> <username> <encrypted_password>winscppasswd.exe 192.168.123.123 root A35C435937195E68B72E3333286D656E726D6A64726D6E6F726D6E6F0F252F3D3831721F3F6D6E6F5D23011F2A5FD8DC56EA
唰的一下,我的密码顺利找回来了,欧耶!
短短1秒钟,密码一览无余,我破防了,太厉害了!
密码找了回来,然而事情就这样结束了吗?
No,No,接着往下看!
其实除了注册表,WinSCP 还可以有其他地方存有会话信息。
我们打开 WinSCP ,点击左下解的 工具(T) 按钮,在弹出的菜单中点击 选项(P) 。
在打开的 选项 窗口中,我们找到 存储 设置一项,在其中我们就可以看到,WinSCP 的会话有三种存储路径。
Windows注册表HKEY_CURRENT_USER\Software\Martin Prikryl\WinSCP 2\Sessions自动INI文件C:\Users\<用户名>\AppData\Roaming\WinSCP.ini自定义INI文件比如:C:\Users\<用户名>\Documents\WinSCP.ini默认情况下,我们的会话就是保存在注册表中的,当然我们还可以按以上方式自由修改存储路径。
因此为了恢复密码,其实我们是不需要刻意修改 WinSCP.ini 的存储路径,也不一定需要去找注册表项。
实际上我们通过点击 工具(T) ,然后再点击 导出/备份配置(E)... 后就可以将 WinSCP.ini 单独保存一份出来。
导出的 WinSCP.ini 文件随便你放哪儿都行。
打开它我们就能看到其中的会话项,并且附带有主机名、用户名以及加密密码等信息,这些其实和注册表中保存的是一样的。
[Sessions\root@192.168.123.123]HostName=192.168.123.123UserName=rootPassword=A35C435937195E68B72E3333286D656E726D6A64726D6E6F726D6E6F0F252F3D3831721F3F6D6E6F5D23011F2A5FD8DC56EA
这里需要注意一下,如果当初保存会话时你没有选择保存密码,那么在配置文件 WinSCP.ini 中是看不到加密密码的哦。
有了导出的 WinSCP.ini 文件,我们同样可以查找对应的会话连接信息而不用专门去查注册表。
然而 WinSCP.ini 文件就只能是用来查会话信息的吗?
事情显然没有那么简单!
正如大神作者说的,他质疑一切第三方不明来源的工具,但人家是大神有能力质疑,我等小白实力不允许,实在是臣妾做不到啊!
哎?也不知道怎么了,暗自崇拜大神的我猛然发现,这玩意居然只有一个源代码文件!
What?真的假的,那这个文件一定很大!
我一边猜度着一边就把这个文件给下载下来了,结果一看,居然只有 2.83K !
哦,天啊,好大啊!这个文件...好...大...啊...!
我嘴里哼了一声,立马用文本编辑器打开了它!
看不懂 Go 的我一头雾水,但还是被我发现了一些端倪。
如下图,似乎命令还支持读取 ini 文件啊!
终于被我发现了啊!
原来,在 Release 发布命令之后,作者又修改强化了命令功能。
我们从下图中能分析出来,Release 最新版是在 2014年3月14日 发布,而源代码文件最后更新大概是在5年前。
那么我们倒推回去就能知道,源代码文件应该是在 2017 年前后做了最后一次更新,很显然要晚于 Release 最新发布日。
要是不相信,我们可以直接跑源代码来证实嘛!
好了,在此之前,我们需要做些准备工作。
到 Golang 中文社区下载最新版 Go 安装,这没啥多说的。
然后 winscppasswd 引用了 github.com/go-ini/ini 包,因此我们还需要做一些工作。
首先,修改环境变量 GOPROXY ,否则无法下载所需程序包。
go env -w GO111MODULE=autogo env -w GOPROXY=https://goproxy.io,direct
其次,获取所需的 ini 程序包。
go get github.com/go-ini/ini
程序包被下载到了 GOPATH 下,默认为以下路径。
C:\Users\<用户名>\go
在下载过程中如果你遇到了除无法下载之外的错误提示,那么多半是你需要升级你的 GO 了。
最后,我们来直接执行源码的方式运行一下看看哈。
go run winscppwd.go
飒!可以看出,它的的确确还支持指定 ini 文件参数的语法,这样就可以批量解密了。
winscppasswd.exe ini [<filepath>]
我们用前面导出的 WinSCP.ini 文件再来试试看哈。
我的个天啊,我的小手在颤抖!
全都出来了,裤子被扒得一干二净,还有没有隐私啦?
好了,我们最后来对比总结一下新旧版本。
旧版语法不支持指定 WinSCP.ini 文件,只能一个一个解密。
新版功能更强大一些,直接甩给它 WinSCP.ini 就能批量找回密码啦!
好了,新版既然如何强大,那么我们当然不能放过罗,直接编译生成新版命令吧!
咳咳,注意啦,你们等待已久的免费下载在此开启啦!
winscppasswd旧版.7z (439K)
下载链接:https://pan.baidu.com/s/1gkxXShfOMMYmYoAtGwCoRQ
提取码:<关注公众号,发送000920>
winscppasswd新版.7z (1.22M) 含源码
下载链接:https://pan.baidu.com/s/1z-blZ0FWs_JVNLQ9tL-vXQ
提取码:<关注公众号,发送000920>
本来打算自己用VB写一个同样可以实现找回密码功能的程序,但是无奈我对 GO 的语法完全是青蛙跳井噗通噗通(不懂不懂),一时半会儿也没办法搞清楚解密的算法,因此暂时放弃,等研究会了算法再次来过。
另外如果只是单纯调用 winscppasswd 命令的基础上写个 GUI 似乎又有些鸡肋,所以说还是要等有朝一日搞懂算法再弄个 GUI 才有意义,对吧!
或者,哪位小伙伴能不吝赐教告诉我这个算法,也省得我担心仅有的那几根毛发不保(保住几根毛不易啊!)。
好了,分享到此又要和小伙伴们说拜拜了!
勿忘点赞、分享转发,切记切记务必偷偷收藏本文,答应我千万不要将本文看到的内容用于不可描述的场合哦!
网管小贾 / sysadm.cc
电脑