安全矩阵

 找回密码
 立即注册
搜索
楼主: Grav1ty

郑嘉源的学习日记

[复制链接]

139

主题

186

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2022-6-2 00:03:29 | 显示全部楼层
SHELL编程备忘



if判断:

[ -a FILE ]        如果 FILE 存在则为真
[ -b FILE ]        如果 FILE 存在且是一个块特殊文件则为真
[ -c FILE ]        如果 FILE 存在且是一个字符特殊文件则为真
[ -e FILE ]        如果 FILE 存在则为真
[ -f FILE ]        如果 FILE 存在且是一个普通文件则为真
[ -g FILE ]        如果 FILE 存在且已经设置了SGID则为真
[ -h FILE ]        如果 FILE 存在且是一个符号连接则为真
[ -k FILE ]        如果 FILE 存在且已经设置了粘制位则为真
[ -r FILE ]        如果 FILE 存在且是可读的则为真
[ -s FILE ]        如果 FILE 存在且大小不为0则为真
[ -t FD ]           如果文件描述符 FD 打开且指向一个终端则为真
[ -u FILE ]        如果 FILE 存在且设置了SUID (set user ID)则为真
[ -w FILE ]        如果 FILE 如果 FILE 存在且是可写的则为真
[ -x FILE ]        如果 FILE 存在且是可执行的则为真
[ -O FILE ]       如果 FILE 存在且属有效用户ID则为真
[ - G FILE ]       如果 FILE 存在且属有效用户组则为真
[ -L FILE ]        如果 FILE 存在且是一个符号连接则为真
[ -N FILE ]        如果 FILE 存在 and has been mod如果ied since it was last read则为真
[ -S FILE ]        如果 FILE 存在且是一个套接字则为真
[ -z STRING ] “STRING” 的长度为零则为真






字符串判断

str1 = str2两个字符串完全相等为真
str1 != str2两个字符串不完全相等为真
-n str1当串的长度大于0时为真(串非空)
-z str1当串的长度为0时为真(空串)
str1当串str1为非空时为真






数字判断

int1 -eq int2        两数字相等为真
int1 -ne int2        两数字不相等为真
int1 -gt int2        int1大于int2为真
int1 -ge int2        int1>= int2为真
in1 -lt int2        int1<int2 为真
int1 -le int2        int1 <= int2为真






文件判断

-r file         用户可读为真
-w file        用户可写为真
-f file         文件为正规文件为真
-x file        用户可执行为真
-d file        文件为目录为真
-c file        存在且是特殊字符文件为真
-s file        文件大小非0为真
-b file        文件为块特殊文件为真
-t file         文件描述符(默认1)指定的设备为终端时为真





回复

使用道具 举报

139

主题

186

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2022-6-5 20:59:37 | 显示全部楼层
本帖最后由 Grav1ty 于 2022-11-12 23:30 编辑

[持续更新]

RAX,EAX,AX,AH,AL关系

|63..32|31..16|15-8|7-0|
                       |AH|AL|
                       |AX.....|
           |EAX................|
|RAX...........................|
gdb常用命令手册(见附件)

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

139

主题

186

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2022-10-29 00:28:04 | 显示全部楼层
驱动1


first.c
  1. #include<ntddk.h>

  2. VOID DriverUnload() {
  3.         DbgPrint("first: Our driver is Unloading... \r\n");
  4. }

  5. NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {
  6.         DbgPrint("first : hello ,my salary!\r\n");
  7.         driver->DriverUnload = DriverUnload;
  8.         return STATUS_SUCCESS;
  9. }
复制代码
makefile
  1. !IF 0

  2. Copyright (C) Microsoft Corporation, 1999 - 2002

  3. Module Name:

  4.     makefile.

  5. Notes:

  6.     DO NOT EDIT THIS FILE!!!  Edit .\sources. if you want to add a new source
  7.     file to this component.  This file merely indirects to the real make file
  8.     that is shared by all the components of Windows NT (DDK)

  9. !ENDIF

  10. !INCLUDE $(NTMAKEENV)\makefile.def
复制代码
sources(这里纠个错,很多书里写是SOURCE,但source没用,会报错“BUILD: Computing Include file dependencies:”)

  1. TARGETNAME=Frist
  2. TARGETPATH=Release
  3. TARGETTYPE=DRIVER

  4. SOURCES=first.c
复制代码


下载WDK7600,build在.\release\ia64下生成:



加载sys需要用到


步骤:









然后打开dbgview



启动试试



回复

使用道具 举报

139

主题

186

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2022-10-29 01:10:41 | 显示全部楼层
本帖最后由 Grav1ty 于 2022-10-29 01:26 编辑

驱动2

串口过滤

大概逻辑:创建虚拟设备(IoCreateDevice)->绑定到真实对象上(IoAttachDeviceToDeviceStack)->分发函数(ccpDispatch)->如果irpsp.MajorFunction是写,则捕获,获取缓冲区及其长度并打印,否则直接放行->动态卸载

用到的重要库中函数:
  1. NTSTATUS IoAttachDeviceToDeviceStackSafe(
  2.   [in]  PDEVICE_OBJECT SourceDevice, //过滤设备
  3.   [in]  PDEVICE_OBJECT TargetDevice,  //要被绑定的设备栈中的设备
  4.   [out] PDEVICE_OBJECT *AttachedToDeviceObject  //返回最终被绑定的设备
  5. );
复制代码
  1. NTSTATUS IoCreateDevice(
  2.   [in]           PDRIVER_OBJECT  DriverObject, //本驱动的驱动对象,由系统给
  3.   [in]           ULONG           DeviceExtensionSize, //设备拓展,此处填0
  4.   [in, optional] PUNICODE_STRING DeviceName,  //设备名称(过滤设备一般不需要名称,故此处填null)
  5.   [in]           DEVICE_TYPE     DeviceType,  //设备类型,填被绑定的设备类型即可
  6.   [in]           ULONG           DeviceCharacteristics,  //设备特征,生成设备对象时一般为0
  7.   [in]           BOOLEAN         Exclusive,
  8.   [out]          PDEVICE_OBJECT  *DeviceObject
  9. );
复制代码
  1. //通过设备名字获取设备对象
复制代码
不知道为什么这个函数在代码块中显示不出来,那就放在正文里
//通过设备名字获取设备对象
NTSTATUS IoGetDeviceObjectPointer(
  [in]  PUNICODE_STRING ObjectName,  //传入设备名称
  [in]  ACCESS_MASK     DesiredAccess,  //期望的权限 直接FILE_ALL_ACCESS即可
  [out] PFILE_OBJECT    *FileObject,  //返回设备对象的同时会返回一个文件对象
  [out] PDEVICE_OBJECT  *DeviceObject  //返回的文件对象
);

  1. void IoSkipCurrentIrpStackLocation(
  2.   [in, out] PIRP Irp
  3. );  //跳过当前栈空间
复制代码
  1. NTSTATUS IofCallDriver(
  2.   PDEVICE_OBJECT        DeviceObject,  //接收irp的设备
  3.   __drv_aliasesMem PIRP Irp  //要发送的irp
  4. );  //把irp发给设备的函数
复制代码

irp结构中有三个地方描述缓冲区:
irp->MDLAddress  比较简单且不追求效率的情况,把R3的缓冲数据拷贝到内核空间
irp->UserBuffer  最追求效率的方案,应用层的缓冲区地址直接放在UserBuffer里,在内核空间中访问
irp->AssociatedIrp.SystemBuffer  把应用层的地址空间映射到内核空间,MDL翻译为“内存描述符链”。irp中的MDLAddress是一个MDL指针,这个MDL可以读出一个内存空间的虚拟地址,这就弥补了UserBuffer的不足,同时比SystemBuffer更轻量

获取缓冲区有多长,对于此处遇到的情况而言:
  1. ULONG len = irpsp->Parameters.Write.Length;
复制代码

  1. void IoDetachDevice(
  2.   [in, out] PDEVICE_OBJECT TargetDevice
  3. );  //负责将绑定的设备解除绑定
复制代码
  1. void IoDeleteDevice(
  2.   [in] PDEVICE_OBJECT DeviceObject
  3. );  //删除设备释放内存
复制代码
  1. NTSTATUS KeDelayExecutionThread(
  2.   [in] KPROCESSOR_MODE WaitMode,
  3.   [in] BOOLEAN         Alertable,
  4.   [in] PLARGE_INTEGER  Interval
  5. );  //延时
复制代码
  1. PVOID MmGetSystemAddressForMdlSafe(
  2.   [in] PMDL  Mdl,
  3.   [in] ULONG Priority
  4. );  //返回指定 MDL 描述的缓冲区的非分页系统空间虚拟地址。
复制代码



完整源码:
comcap.c
  1. #include<ntddk.h>
  2. #include<ntstrsafe.h>

  3. #define NTSTRSAFE_LIB  //为了使用静态的ntstrsafe静态库
  4. #define DELAY_ONE_MICROSECOND (-10)
  5. #define DELAY_ONE_MILLISECOND (DELAY_ONE_MICROSECOND*1000)
  6. #define DELAY_ONE_SECOND (DELAY_ONE_MILLISECOND*1000)
  7. #define CCP_MAX_COM_ID 32  //假设最多有32个设备
  8. //保存所有过滤设备指针
  9. static PDEVICE_OBJECT s_fltobj[CCP_MAX_COM_ID] = { 0 };
  10. //保存所有真实设备指针
  11. static PDEVICE_OBJECT s_nextobj[CCP_MAX_COM_ID] = { 0 };

  12. PDEVICE_OBJECT ccpOpenCom();
  13. NTSTATUS ccpAttachDevice();
  14. void ccpAttachAllComs();
  15. void ccpUnload();
  16. NTSTATUS ccpDispatch();
  17. NTSTATUS DriverEntry();

  18. //生成过滤设备并绑定
  19. NTSTATUS ccpAttachDevice(PDRIVER_OBJECT driver, PDEVICE_OBJECT oldobj, PDEVICE_OBJECT* fltobj, PDEVICE_OBJECT* next) {
  20.         NTSTATUS status;
  21.         PDEVICE_OBJECT topdev = NULL;

  22.         //生成设备
  23.         status = IoCreateDevice(
  24.                 driver,//本驱动的驱动对象,由系统给                        
  25.                 0,//设备拓展,此处填0
  26.                 NULL,//设备名称(过滤设备一般不需要名称,故此处填null)
  27.                 oldobj->DeviceType,//设备类型,填被绑定的设备类型即可
  28.                 0,//设备特征,生成设备对象时一般为0
  29.                 FALSE,
  30.                 fltobj);
  31.         if (status != STATUS_SUCCESS) return status;

  32.         //拷贝重要标志位
  33.         if (oldobj->Flags & DO_BUFFERED_IO) (*fltobj)->Flags |= DO_BUFFERED_IO;
  34.         if (oldobj->Flags & DO_DIRECT_IO) (*fltobj)->Flags |= DO_DIRECT_IO;
  35.         if (oldobj->Characteristics & FILE_DEVICE_SECURE_OPEN) (*fltobj)->Characteristics |= FILE_DEVICE_SECURE_OPEN;
  36.         (*fltobj)->Flags |= DO_POWER_PAGABLE;

  37.         //将一个设备保存到另一个设备上
  38.         topdev = IoAttachDeviceToDeviceStack(*fltobj, oldobj);
  39.         if (topdev == NULL) {
  40.                 //如果绑定失败,销毁设备,返回错误
  41.                 IoDeleteDevice(*fltobj);
  42.                 *fltobj = NULL;
  43.                 status = STATUS_UNSUCCESSFUL;
  44.                 return status;
  45.         }
  46.         *next = topdev;

  47.         //设置这个设备已经启用
  48.         (*fltobj)->Flags = (*fltobj)->Flags & ~DO_DEVICE_INITIALIZING;
  49.         return STATUS_SUCCESS;
  50. }


  51. //从名字获取设备对象
  52. PDEVICE_OBJECT ccpOpenCom(ULONG id, NTSTATUS* status) {
  53.         //输入的是串口的id,需要改写成unicode_str的形式
  54.         UNICODE_STRING name_str;
  55.         static WCHAR name[32] = { 0 };
  56.         PFILE_OBJECT fileobj = NULL;
  57.         PDEVICE_OBJECT devobj = NULL;

  58.         //根据id转换成串口的名字
  59.         memset(name, 0, sizeof(WCHAR) * 32);
  60.         RtlStringCchPrintfW(
  61.                 name, 32,
  62.                 L"\\Device\\Serial%d", id
  63.         );
  64.         RtlInitUnicodeString(&name_str, name);

  65.         //打开设备对象
  66.         *status = IoGetDeviceObjectPointer(&name_str, FILE_ALL_ACCESS, &fileobj, &devobj);

  67.         //如果打开成功了,一定要解除引用
  68.         //别忘了这一句:
  69.         if (*status == STATUS_SUCCESS) ObDereferenceObject(fileobj);

  70.         //返回设备对象
  71.         return devobj;
  72. }

  73. //绑定所有的串口
  74. void ccpAttachAllComs(PDRIVER_OBJECT driver) {
  75.         ULONG i;
  76.         PDEVICE_OBJECT com_ob;
  77.         NTSTATUS status;
  78.         for (i = 0; i < CCP_MAX_COM_ID; i++) {
  79.                 com_ob = ccpOpenCom(i, &status);
  80.                 if (com_ob == NULL) {
  81.                         continue;
  82.                 }
  83.                 ccpAttachDevice(driver, com_ob, &s_fltobj[i], &s_nextobj[i]);
  84.         }
  85. }

  86. //分发函数
  87. NTSTATUS ccpDispatch(PDEVICE_OBJECT device,PIRP irp)
  88. {
  89.         PIO_STACK_LOCATION irpsp = IoGetCurrentIrpStackLocation(irp);
  90.         NTSTATUS status;
  91.         ULONG i, j;

  92.         for (i = 0; i < CCP_MAX_COM_ID; i++)
  93.         {
  94.                 if (s_fltobj[i] == device)
  95.                 {
  96.                         //所有电源操作,全部直接放过
  97.                         if (irpsp->MajorFunction == IRP_MJ_POWER)
  98.                         {
  99.                                 //直接发送,然后返回说已经处理了
  100.                                 PoStartNextPowerIrp(irp);
  101.                                 IoSkipCurrentIrpStackLocation(irp);
  102.                                 return PoCallDriver(s_nextobj[i], irp);
  103.                         }

  104.                         //此外我们只过滤写请求,写请求,获得缓冲区及其长度
  105.                         //然后打印
  106.                         if (irpsp->MajorFunction == IRP_MJ_WRITE)
  107.                         {        
  108.                                 //如果是写,先获得长度
  109.                                 ULONG len = irpsp->Parameters.Write.Length;
  110.                                 //然后获得缓冲区
  111.                                 PUCHAR buf = NULL;
  112.                                 if (irp->MdlAddress != NULL) buf = (PUCHAR)MmGetSystemAddressForMdlSafe(irp->MdlAddress, NormalPagePriority);
  113.                                 else buf = (PUCHAR)irp->UserBuffer;
  114.                                 if (buf == NULL) buf = (PUCHAR)irp->AssociatedIrp.SystemBuffer;

  115.                                 //打印内容
  116.                                 for (j = 0; j < len; ++j)
  117.                                 {
  118.                                         DbgPrint("comcap: Send Data: %2x\r\n", buf[j]);
  119.                                 }
  120.                         }
  121.                         //这些请求直接下发执行即可,我们并不禁止或者改变它
  122.                         IoSkipCurrentIrpStackLocation(irp);
  123.                         return IoCallDriver(s_nextobj[i], irp);
  124.                 }
  125.         }

  126.         //如果根本就不在被绑定的设备中,那就是有问题的,直接返回参数错误
  127.         irp->IoStatus.Information = 0;
  128.         irp->IoStatus.Status = STATUS_INVALID_PARAMETER;
  129.         IoCompleteRequest(irp, IO_NO_INCREMENT);
  130.         return STATUS_SUCCESS;
  131. }

  132. //动态卸载
  133. void ccpUnload(PDRIVER_OBJECT drv) {
  134.         ULONG i;
  135.         LARGE_INTEGER interval;

  136.         //首先解除绑定
  137.         for (i = 0; i < CCP_MAX_COM_ID; i++) {
  138.                 if (s_nextobj[i] != NULL) {
  139.                         IoDetachDevice(s_nextobj[i]);
  140.                 }
  141.                
  142.                 //睡眠5秒,等待所有irp处理结束
  143.                 interval.QuadPart = (5 * 1000 * DELAY_ONE_MILLISECOND);
  144.                 KeDelayExecutionThread(KernelMode, FALSE, &interval);

  145.                 //删除这些设备
  146.                 for (i = 0; i < CCP_MAX_COM_ID; i++) {
  147.                         if (s_fltobj[i] != NULL) {
  148.                                 IoDeleteDevice(s_fltobj[i]);
  149.                         }
  150.                 }
  151.         }
  152. }


  153. NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg_path) {
  154.         size_t i;
  155.         //所有看的分发函数都设置成一样的
  156.         for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
  157.                 driver->MajorFunction[i] = ccpDispatch;
  158.         }

  159.         //支持动态卸载
  160.         driver->DriverUnload = ccpUnload;
  161.         //绑定所有串口
  162.         ccpAttachAllComs(driver);
  163.         //直接返回成功即可
  164.         return STATUS_SUCCESS;
  165. }
复制代码


sources
  1. TARGETNAME=comcap
  2. TARGETPATH=Release
  3. TARGETTYPE=DRIVER

  4. SOURCES=comcap.c
复制代码

安装后



回复

使用道具 举报

139

主题

186

帖子

955

积分

高级会员

Rank: 4

积分
955
 楼主| 发表于 2022-11-23 01:17:49 | 显示全部楼层
本帖最后由 Grav1ty 于 2022-11-23 12:50 编辑

Linux强制用户下线

w查看用户及其tty
  1. root@VM-16-6-debian:~# w
  2. 00:40:06 up 12 days,  7:54,  3 users,  load average: 0.02, 0.04, 0.00
  3. USER     TTY      FROM             LOGIN@   IDLE   JCPU   PCPU WHAT
  4. ****  pts/0    xxx.xxx.xxx.xxx  00:20   12:00  18.77s 17.72s ruby /usr/bin/msfconsole
  5. root     pts/1 xxx.xxx.xxx.xxx 00:29    6:13   0.01s  0.01s -bash
  6. root     pts/2 xxx.xxx.xxx.xxx 00:39    0.00s  0.01s  0.00s w
复制代码
pkill -kill -t tty
  1. pkill -kill -t pts/0
复制代码
效果:


所属该用户的进程也全部结束


注:只有root能让别人下线,且root能让另外一个root下线。



Linux登录管理
who 显示当前当登录的用户的信息
w 显示登录的用户及其当前执行的任务
users 显示当前当登录的用户的用户名
last 显示当前与过去登录系统的用户的信息
lastb 显示所有登录系统失败的用户的信息 不看不知道 我的ssh正在被别人爆破。。。

lastlog 显示用户最后一次登录的信息




windows自带工具certutil

总是用certutil -hashfile看文件的哈希值,却一直没好好学一下这东西还有其他什么用


Certutil是一个CLI程序,可用于转储和显示证书颁发机构(CA),配置信息,证书服务,CA组件的备份和还原以及验证证书,密钥对和证书链,它作为证书服务的一部分安装。
这个工具从windows2003开始就系统自带


以下举例一些基础的,常用的 还有高级的可查看文档 附在末尾了
base64编码:
  1. certutil -encode 目标文件 生成文件
复制代码
16进制编码:
  1. certutil -encodehex 目标文件 生成文件
复制代码


解码base64
  1. certutil -decode new.txt target.txt
复制代码
解码16进制
  1. D:\>certutil -decodehex new1.txt target1.txt
复制代码




散列:
命令就不敲了,直接看图


所以这东西在免杀上有奇效

另外他还可以下载文件 类似curl -o 有些文章说可以配合编码达到落地免杀效果 我没试过
  1. certutil -urlcache -split -f 目标地址
复制代码




它还可以查看错误码
  1. certutil -error 错误码
复制代码



更全的可以看这篇 几乎可以当字典查:
  1. https://blog.geekdt.com/636.html
  2. https://zhuanlan.zhihu.com/p/107415501
复制代码
还有ms的官方文档:
  1. https://learn.microsoft.com/zh-cn/windows-server/administration/windows-commands/certutil?view=vs-2015
复制代码






回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2022-12-4 23:53 , Processed in 0.013117 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表