调用psutil库,做一个循环,每次获取全部进程pid,如果进程数量有变化就对比找出新产生的进程。
像linux系统,webshell管理工具为中国蚁剑
,只要webshell执行了系统命令,就一定会有新进程产生,该图特征的进程就为sh,如果是Windows系统的话,为cmd.exe,可以根据这些特征对入侵检测系统监控进程进行编写规则
在windows平台的中国蚁剑,针对于p.name() == "cmd.exe"的话,我们就杀死该进程,从图可以看到,刚好要cd切换到www目录,就被干掉了,杀死的那瞬间因为异常变成ret=-1,后面不管输入什么命令都无法进行执行,那这个ret=-1,意思是,进程内部其实是执行到返回地址,但被杀死的那瞬间,返回地址没有完全返回,就成了这副逼样,这也是入侵检测系统防御黑客webshell执行命令的一个有效防御方法。
关于使用DLL注入技术,利用Windows平台,只要黑客调用了cmd.exe这个进程相关,那么立刻对该进程进行注入并弹出窗口提示,从而报告有黑客入侵行为
代码如下
import sys
from ctypes import *
import win32api
import win32con
FAGE_READWRITE =0x04
PROCESS_ALL_ACCESS =0x001F0
FFFVIRTUAL_MEN = (0x1000 | 0x2000)
kernel32 = windll.kernel32
user32 = windll.user32
dll_path = ‘cmd.exe’
dll_len = len(dll_path)
for pid in pids:
p = psutil.Process(pid)
if p.name() == ‘cmd.exe’:
break
h_process =
kernel32.OpenProcess(PROCESS_ALL_ACCESS,False,int(pid))
if not h_process:
print “[] Couldn’t acquire a handle to PID: %s" % pid
sys.exit()
argv_address = kernel32.VirtualAllocEx(h_process,0,dll_len,VIRTUAL_MEN,FAGE_READWRITE)
written = c_int(0)
kernel32.WriteProcessMemory(h_process,argv_address,dll_path,dll_len,byref(written))
h_user32 = kernel32.GetModuleHandleA(“kernel32.dll”)
h_loadlib = kernel32.GetProcAddress(h_user32,“MessageBoxA”)
thread_id = c_ulong(0)
if not kernel32.CreateRemoteThread( h_process, None, 0, h_loadlib, argv_address, 0, byref(thread_id)): print "[] Failed to inject the DLL. Exiting.”
sys.exit()
else:
win32api.MessageBox(0, “入侵检测已发现入侵行为”, ‘黑客提示’)
print “thread_ID: 0x%08x create” % thread_id.value
后面还可以如果webshell执行了系统命令,那么报警发送一封QQ邮件,怎么实现这个功能呢?
https://www.cnblogs.com/mpp0905/p/8419869.html
如这个链接所示
按照这个思路,实现这个监控进程webshell执行系统命令