拿服务器
NSA 的系列漏洞爆出来时就通过 EternalBlue 拿了服务器,开了 3389,不过当时没能拿到正方加密的 Key,就放在那没动过了。
源码分析
又上去翻了翻,先把源码全部弄下来。
通过 web.config 文件得到数据库的一些信息。
<add key="MyConn" value="pooling=true;Max Pool Size=100;Min Pool Size=10;Data Source=****;User Id=****;Password="/>
<add key="MyPwd" value="********"/>
利用正方解密工具,默认的 Key 解出来乱码,看来是改过了。
逆向 DLL
从 bin 文件夹中找到 zjdx.dll,用 PEiD 看下。
其实不用看的,.Net 的网站,肯定是 C# 写的。
用 dnSpy 打开,根据网上已有的文章,直接跟到 mmtp 类。
在 BindToDDL 函数中,即可看到我们所需要的 Key。
public void BindToDDL(string strSQL, DropDownList ListName, string dtField, string dvField)
{
OracleConnection oracleConnection = new OracleConnection(ConfigurationSettings.get_AppSettings().get_Item("MyConn") + this.jiemi(ConfigurationSettings.get_AppSettings().get_Item("MyPwd"), "keykey"));
之后就可以用网上有的解密工具解了,比如 K8 的。
不过当时没看到有这么个东西,网上搜了好些代码,跑起来都不对,只好慢慢改,挺简单的一个异或加密,跟着逻辑一步一步来就可以看明白了。
def squarer(value, key):
if len(value) % 2 == 0:
p = int(round(len(value)) / 2.0)
value = value[:p][::-1] + value[-p:][::-1]
print value
k = 0
result = ''
for i in range(0, len(value)):
v = value[i]
if ord(v) ^ ord(key[k]) < 32 or ord(v) ^ ord(key[k]) > 126 or ord(v) < 0 or ord(v) > 255:
# print v
result += v
else:
result += chr(ord(v) ^ ord(key[k]))
if k == len(key) - 1:
k = 0
else:
k = k + 1
return result
print squarer("*********", '*******')
连接数据库
原以为到这就可以搞定了,结果 sqlplus 了半天都进不去数据库。。。后来还是在 Oracle 自己 GUI 客户端里发现是站库分离的,通过历史连接记录找到了数据库的 IP 地址,Navicat 连接成功,查到人名,可以结束了。