初春,乍暖还寒,心情不错的我哼着小曲踱进了卫生间。

正当我吹着口哨带薪放松的时候,忽然收到老板的消息,说是服务器无法登录了。

特么搞什么灰机?没见我正忙着呢嘛!

我急忙抖动了两下,一边忿忿不平,一边小步快走,现在的春天还是挺冷的啊!


搞慢了又得挨老板骂,我立马回到工位,熟练地打开了 Putty ,一顿噼里啪啦输入用户名和密码,回车走起!

哎呀我去,我眼镜滑了一下,还真是无法登录哈!


密码是多少来着?

一连试了好N多次都失败了,我心里开始有点发毛......

系统运行倒是一切正常,就是密码怎么也不正确!

难道被黑了?不可能啊!

所有记得的密码都试了个遍,都不对,实在是想不起来还能有什么密码了。

这时突然想起来,为了往服务器里传数据,我还用过 WinSCP 连接过服务器,那上面还保存着密码呢!


嘿嘿,想在这儿,我立马打开了 WinSCP ,太好了,密码还真保存着呢!


尝试登录了一下,果然成功登录服务器,看来保存的密码是OK的!

只是如果调用 Putty ,还是要你输入密码才行,这可怎么办?

再这样下去可不行,时间紧迫,于是我马上上网看看有没有啥好办法。


哎,没想到哈,网上关于解密 WinSCP 会话密码的文章还挺多。

不过这些文章都指向了一个叫作 winscppasswd 的程序,于是我最后找到了它在 GitHub 上的同名项目。

https://github.com/anoopengineer/winscppasswd


winscppasswd 介绍

winscppasswdWinSCP 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


根据这些提示,再加上 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 还可以有其他地方存有会话信息。

我们打开 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\该邮件地址已受到反垃圾邮件插件保护。要显示它需要在浏览器中启用 JavaScript。]
HostName=192.168.123.123
UserName=root
Password=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=auto
go 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 才有意义,对吧!

或者,哪位小伙伴能不吝赐教告诉我这个算法,也省得我担心仅有的那几根毛发不保(保住几根毛不易啊!)。

好了,分享到此又要和小伙伴们说拜拜了!

勿忘点赞、分享转发,切记切记务必偷偷收藏本文,答应我千万不要将本文看到的内容用于不可描述的场合哦!


扫码关注@网管小贾,阅读更多

网管小贾的博客 / www.sysadm.cc



暂无评论

登录并提交评论

© 2020-present 网管小贾 | 微信公众号 @网管小贾
许可协议:CC-BY-NC 4.0 | 转载文章请注明作者出处及相关链接