拿服务器
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 连接成功,查到人名,可以结束了。