声明:该文章为转载,转载的原因的该作者抓住了问题所在的关键,用了一个比较好的方法去防止ASPX木马来运行CMD.EXE或其它木马程序。
================================== 转载可以,必须保留此版权信息。 Author: Zhi-Liang QQ: 939178212 Weibo: http://weibo.com/2256092210 ==================================
最近一朋友说他的服务器老是被上传了ASPX木马,今天删了明天还来。而且有一大堆恶意exe文件。 我随手开了一个ASPX木马(大名鼎鼎ASPXSpy。。。),哈,功能挺齐全。。。跟收费版的webshell有得一拼。。 根据ASPXSpy的代码设置服务器,把SysInfo、RegShell、IIS Spy等功能都废了,唯独CmdShell搞不定。。(ASP木马用WScript.Shell或Shell.Application来运行exe,酱紫比较好解决。) 于是就琢磨琢磨,发现所有服务器脚本木马运行的外部exe都是由w3wp.exe启动的,这下好解决了哈~~~~~~ 可写出一个程序:禁止进程名字为w3wp.exe的程序执行任何外部exe。 由于应用层比较难实现这个功能,就算实现了也难免有绕过的方法(俺功底不深嘛。。。这个世界上比我厉害的高人可不少) 于是转战到少人问津的领地——系统核心层,写驱动程序~~~ 具体思路:
在驱动入口函数DriverEntry处调用PsSetCreateProcessNotifyRoutine函数设置一个进程创建回调,用于监控所有启动的进程。 NTSTATUS PsSetCreateProcessNotifyRoutine(PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine,BOOLEAN Remove); 参数不多~~我喜欢这种类型的~~~(不是女孩啊~) PCREATE_PROCESS_NOTIFY_ROUTINE NotifyRoutine :回调地址,有进程创建的时候系统就会调用它了 BOOLEAN Remove :创建后不用当然要废掉回调啦~~Remove设为False的时候表示创建回调,反之设置为True的时候表示删除回调(驱动卸除前不删掉回调200%蓝屏死鸡哦~~~蓝屏的钙 好喝的钙~~~) 知道这点就好办了。
接着来说说回调里干嘛。。 回调格式: void NotifyRoutine(HANDLE ParentId,HANDLE ProcessId,BOOLEAN Create) HANDLE ParentId:新运行的进程的“老爸”(父进程,不是李刚啊!!!) HANDLE ProcessId:新运行的进程的PID(你懂的,不解释~~) BOOLEAN Create:当这个Create=True时,表示有新的程序运行,反之=False时就是退出、结束。
在回调里面: 1.获取ParentId的进程名字(PsLookupProcessByProcessId+PsGetProcessImageName) 2.判断进程名是不是“w3wp.exe” 3.是,那就把这个w3wp.exe新生出来的儿子ProcessId给杀掉(PsLookupProcessByProcessId+ObOpenObjectByPointer+ZwTerminateProcess);不是,那就不多管闲事了。
酱紫就可以把w3wp.exe运行的外部exe杀掉,永远不能运行,这样很牛x的ASPXSpy的CmdShell功能就废掉了。 骇客同志们~~~你把exe上传到网页空间、WScript.Shell等功能也没禁用 还是不能运行木马exe程序来攻击服务器了~~~~
有的童鞋可能看不懂我这些“火星文”,那就闲话不说~直接发代码~
/* Author: Zhi-Liang QQ: 939178212 Weibo: http://weibo.com/2256092210 */ #include "ntddk.h" NTKERNELAPI NTSTATUS PsLookupProcessByProcessId(ULONG UniqueProcessId,PEPROCESS *Process); NTKERNELAPI UCHAR *PsGetProcessImageFileName(PEPROCESS Process); NTKERNELAPI NTSTATUS ObOpenObjectByPointer(PVOID Object,ULONG HandleAttributes,PACCESS_STATE PassedAccessState,ACCESS_MASK DesiredAccess,POBJECT_TYPE ObjectType,KPROCESSOR_MODE AccessMode,PHANDLE Handle); void KillProcess(ULONG PId) { PEPROCESS Process; if (NT_SUCCESS(PsLookupProcessByProcessId(PId,&Process))) { HANDLE ProcessHandle; ObOpenObjectByPointer(Process,NULL,NULL,NULL,NULL,KernelMode,&ProcessHandle); ZwTerminateProcess(ProcessHandle,1); ZwClose(ProcessHandle); ObDereferenceObject(Process); } return; } void CreateProcessNotifyRoutine(HANDLE ParentId,HANDLE ProcessId,BOOLEAN Create) { if (Create) { PEPROCESS Process; if (NT_SUCCESS(PsLookupProcessByProcessId(ParentId,&Process))) { if(!_stricmp(PsGetProcessImageFileName(Process),"w3wp.exe")) { KillProcess(ProcessId); } ObDereferenceObject(Process); } } } void DriverUnLoad(PDRIVER_OBJECT DriverObject) { PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine,TRUE); } NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath) { PsSetCreateProcessNotifyRoutine(CreateProcessNotifyRoutine,FALSE); DriverObject->DriverUnload = DriverUnLoad; return STATUS_SUCCESS; }