联通光猫管理员密码分析(HG220GS-U)
阅读原文时间:2021年05月04日阅读:1

联通光猫管理员密码分析,不安全的密码方案

联通光猫型号:HG220GS-U
软件版本:E00L3.03

运营商一直在做光猫防破解,对抗升级还是比较快的,所有的分析结论都和版本绑定的,因为运营商或者路由器的开发商看到后可能立马就改了。

我自己主要是要改为桥接,这个需求其实打联通的保修电话让局端改一下应该就能搞定。不过之前看过一两个老版本的教程,也照葫芦画瓢破解成功了,但我手上的这个版本有点麻烦,现有的教程基本都失效了。有点好奇,这次花点时间仔细看了一下,不过这次被某些人打击得比较厉害,说果然是IT狗云云,只知道和代码过不去。都云作者痴,谁解其中味!

这个光猫,先要用普通的user用户和印在光猫背面的密码登录进去,然后改链接为http://192.168.1.1/servmngr.html,在这个页面中把管理员帐号enable,telnet、ftp服务也enable了,注意只针对LAN这一侧开放访问。telnet服务的默认用户名和密码都是admin。进入telnet后运行sh就是普通的shell界面。这些是在网上仔细搜能搜到的。

既然telnet、ftp权限都有了,那就把文件拿出来分析好了。最后要分析的是下面三个文件,关键函数是cgiAuthAdminPassword(),点到为止,有兴趣的可以自己看看。话说Ghidra对MIPS的反编译还是可以看的。新版的IDA 7.5虽然支持MIPS反编译,不过我没有。
/bin/httpd
/lib/public/libcms_util.so
/lib/public/libaes.so

下面是根据光猫MAC地址计算CUAdmin这个用户的密码。EPON的猫需要用其base MAC,也就是“设备基本信息”那个页面中看到的MAC/SN的值,大写。可以看出这个计算很简单,就是用零补齐后AES加密。EPON类型的光猫,这个密码和area code也有关。GPON类型的光猫,则是用其serial number计算的,此处未体现。所以光猫的WEB端口千万不要针对WAN一侧开放,否则被探测出MAC地址的话,有可能随便被人访问。LAN侧如果是很多人能访问的光猫,也得小心。本质上光猫的这个管理员密码设定是不安全的,虽然是一机一码,然而却是确定的,重复一次:这个密码方案是不安全的!

所幸的是,管理员CUAdmin账户默认没开启,需要用一机一码的user帐号登录进去后才能开启。至于user帐号的密码,有待分析。

#include
#include

#include
#pragma comment(lib, "libeay32.lib")

static const unsigned char encryptionKey[] = "JmpwfGjcfsjpnfJmpwfGjcfsjpnf0000";

void Encrypt(unsigned char *in, size_t inLen, unsigned char *out, size_t &outLen)
{
AES_KEY aesContext;

AES\_set\_encrypt\_key(encryptionKey, , &aesContext);

outLen = ;  
for (size\_t k = ; k < inLen; k += AES\_BLOCK\_SIZE, outLen += AES\_BLOCK\_SIZE)  
{  
    unsigned char padded\[AES\_BLOCK\_SIZE\] = {};  
    memcpy(padded, &in\[k\], (k + AES\_BLOCK\_SIZE) < inLen ? AES\_BLOCK\_SIZE : inLen - k);  
    AES\_ecb\_encrypt(padded, &out\[k\], &aesContext, AES\_ENCRYPT);  
}  

}

int main(int argc, char** argv)
{
static unsigned char mac[] = "";

constexpr size\_t insize = sizeof(mac) - ;  
constexpr size\_t remain = insize % AES\_BLOCK\_SIZE;  
constexpr size\_t outsize = remain ? insize - remain + AES\_BLOCK\_SIZE : insize;

unsigned char out\[outsize\] = {};

size\_t outlen = ;  
Encrypt(mac, sizeof(mac) - , out, outlen);

CString passwd;  
for (size\_t k = ; k < outlen; ++k)  
{  
    CString t;  
    t.Format(L"%02X", out\[k\]);  
    passwd += t;  
}

\_tprintf(\_T("password for CUAdmin: %s\\n"), (LPCTSTR)passwd);  

}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章