本笔记为 泷羽sec 《红队全栈课程》学习笔记,课程请可自行前往B站学习,课程/笔记主要涉及网络安全相关知识、系统以及工具的介绍等,请使用该课程、本笔记以及课程和笔记中提及工具的读者,遵守网络安全相关法律法规,切勿进行违法违规违纪的操作。
写在最前面的话,我们为什么要学习网络安全这门技术:
- 维护国家安全
防范网络攻击:网络安全威胁已成为国家安全的重要挑战。学习网络安全有助于识别和防范来自国内外的网络攻击,防止敌对势力通过网络手段窃取敏感信息、破坏关键基础设施或干扰社会正常运作。
保护关键基础设施:现代社会高度依赖网络技术,金融系统、交通网络、电力供应等关键基础设施都依赖于稳定的网络环境。掌握网络安全知识有助于保护这些基础设施免受网络攻击,确保国家的正常运转。
- 促进经济发展
保障数字经济安全:数字经济已成为国家经济增长的重要引擎。通过学习网络安全,可以保障数字经济的健康发展,防止数据泄露和网络犯罪对经济活动的干扰。
增强国际竞争力:在全球化的背景下,网络安全技术水平直接影响国家的国际竞争力。掌握先进的网络安全技术和策略,有助于提升国家在全球数字经济中的地位。
- 提升社会稳定
防范社会风险:网络犯罪和网络恐怖主义对社会稳定构成严重威胁。学习网络安全有助于及时发现和应对这些风险,维护社会的和谐与稳定。
保护公民权益:网络安全直接关系到公民的隐私权和信息安全。通过学习网络安全,可以更好地保护公民的合法权益,增强公众对政府和企业的信任。
- 推动科技进步
创新安全技术:网络安全领域的技术创新不断推动信息技术的进步。学习网络安全有助于推动新技术的研发和应用,提升国家在科技领域的整体实力。
促进国际合作:网络安全是全球性问题,需要各国共同努力应对。通过学习网络安全,可以参与国际网络安全合作,共同制定国际标准和规范,提升全球网络安全水平。
- 强化法治建设
完善法律法规:学习网络安全有助于推动和完善相关法律法规的制定和实施,确保网络安全工作有法可依、有章可循。
提升执法能力:掌握网络安全知识可以提升执法部门的网络侦查和取证能力,有效打击网络犯罪,维护法律权威。
- 培养专业人才
构建人才梯队:网络安全领域需要大量高素质的专业人才。通过系统学习和培训,可以培养出一批具备专业知识和实战经验的网络安全专家,为国家的网络安全事业提供坚实的人才保障。
总之,学习网络安全不仅是个人职业发展的需要,更是维护国家安全、促进经济发展、保障社会稳定和推动科技进步的重要手段。通过不断提升网络安全意识和能力,我们可以更好地应对日益复杂的网络安全挑战,为实现国家的长期稳定和发展贡献力量。
系列课程视频详见泷羽sec 的小破站主页 传送门 ==> 泷羽sec个人主页-哔哩哔哩视频
一、作业要求
1)使用 Windows 的命令写一个计算器,用于加减乘除的简单运算
要求:输入例如:1+1,输出结果为2;10行内写出,不允许叠加
2)分析 Windows 课程中资源耗尽型病毒的原理
要求:发给管理员截图的静态分析,截图标注 bat 文件运行步骤
二、作业1分析
作业要求使用 Windows 自带的命令解决项目需求,因此无法使用 Python 的 eval(input("请输入运算表达式") 等方法解题。但是,实际上 Windows 的 CMD 也自带了一个类似的函数,就是 SET 命令。
三、Windows 的 SET 命令介绍 以及作业
SET 命令是一个在命令提示符(cmd)中用于定义、修改或显示环境变量及其值的强大工具,其用法较多,其中:
1、基本用法:
1)显示环境变量
SET 命令不带任何参数,将显示当前会话中的所有环境变量及其值。注意,Windows 是大小写不敏感的,所以使用SET / set 均可,包括后面的变量名也是。
C:\>set
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Chloe\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
(输出较多不一一展示)
如果我们输入 set a 会列出所有以字母a开头的变量,注意 SET A 和 set a 得到的结果其实都一样;另外,我们还可以用 set tm 来让 cmd 列出 tmp 的值:
C:\>set a
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Chloe\AppData\Roaming
C:\>set t
TEMP=C:\Users\Chloe\AppData\Local\Temp
TMP=C:\Users\Chloe\AppData\Local\Temp
C:\>set tm
TMP=C:\Users\Chloe\AppData\Local\Temp
另外我们再观察仔细一些的话,可以看到 set 显示的 环境变量 和 操作系统高级设置内的 环境变量 是匹配的,而 环境变量 又是由 用户变量 和 系统变量 所组成,两者区别在于,用户变量 只针对当前用户生效,切换其他用户后变量值会改变:
关于环境变量生效的说明
我们可以尝试在 系统变量 或者 用户变量 添加一个变量,比如 test = 1111 ,再新开一个 cmd 窗口用 set 命令查看下。注意一定要新开 cmd,这是因为 系统变量 或者 用户变量 设置后,新开 cmd 窗口才会生效:
2)设置或修改环境变量
set /? 可以看到设置环境变量的方法,具体为:
SET [variable=[string]]
variable 指定环境变量名。
string 指定要指派给变量的一系列字符串。
我们除了需要密切注意到 Windows 是大小写不敏感的,还需要注意到另外等号两边带空格和不带空格的结果也完全都是不一样的。
C:\>set a=1 # 注意这个a是小写
C:\>set a =2 # 注意这个变量叫"a "
C:\>set a # set a 就会列出所有a开头的变量
a=1
a =2
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Chloe\AppData\Roaming
C:\Windows\System32>echo ===%a%=== # 我们用echo命令输出下2个变量,看到的值完全是不一样的
===1===
C:\Windows\System32>echo ===%a %===
=== 2===
关于定义特殊符号 < > & | ^
如果 set a=< ,就是把环境变量 a 设置成小于号,这种情况下要么用双引号,要么用 ^ 符号进行转义。如果要设置成 ^ ,也必须自己再转个义。
C:\Windows\System32>set a=<
命令语法不正确。
C:\Windows\System32>set a=^<
C:\Windows\System32>set a
a=<
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\admin\AppData\Roaming
C:\Windows\System32>set b=a&b
'b' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\Windows\System32>set b=a^&b
C:\Windows\System32>set c="b&c"
C:\Windows\System32>set
a=<
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\admin\AppData\Roaming
b=a&b
c="b&c"
C:\Windows\System32>set d=^
More? ^
C:\Windows\System32>set d
d=^
当前 cmd 窗口设置的环境变量仅对当前窗口生效
理解这一点其实很容易,我们在 cmd 窗口1设置个新的环境变量,再新建个 cmd 窗口 set 下这个环境变量,发现新窗口中是不存在的。
如果 start cmd 则环境变量会被新的 cmd 窗口继承
关于 errorlevel 的说明
如果我们查看 set 的帮助,可以看到“如果在当前环境中找不到该变量名称,SET 命令将把 ERRORLEVEL 设置成 1。”这条说明。我们可以自己动手尝试下,可以看到如下的结果:
C:\Windows\System32>echo %errorlevel% # 我们最开始 echo errorlevel 这个变量,值为 0
0
C:\Windows\System32>set a # 我们再 set 一个已经存在的变量
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\admin\AppData\Roaming
C:\Windows\System32>echo %errorlevel% # 此时值还为0
0
C:\Windows\System32>set z # 我们 set 一个不存在的变量
环境变量 z 没有定义
C:\Windows\System32>echo %errorlevel% # 此时值已经变为 1 了
1
C:\Windows\System32>set a # 后面即便再 set 存在的变量
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\admin\AppData\Roaming
C:\Windows\System32>echo %errorlevel% # 不会对 errorlevel 发生改变
1
另外,如果程序错误,error level 会变成另外个值:
C:\Windows\System32>echo %errorlevel% # 最开始是 0
0
C:\Windows\System32>test # 故意运行个不存在的程序,系统报错了
'test' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\Windows\System32>echo %errorlevel% # 这个时候再看 errorlevle 变成 9009 了
9009
C:\Windows\System32>set z # 我们再 set 一个不存在的环境变量
环境变量 z 没有定义
C:\Windows\System32>echo %errorlevel% # errorlevle 又变成 1 了
1
C:\Windows\System32>test # 接下来 errorlevel 会在 9009 和 1 之间反复横跳
'test' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\Windows\System32>echo %errorlevel%
9009
3)删除环境变量
这个也很简单,设置环境变量的时候等号右边置空即可。
C:\Windows\System32>set a=111
C:\Windows\System32>set a
a=111
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\admin\AppData\Roaming
C:\Windows\System32>set a=
C:\Windows\System32>set a
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\admin\AppData\Roaming
2、set 的 /a 命令行开关
set /a 的系统说明是这样的:
/A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式评估器很简单并以递减的优先权顺序支持下列操作:
运算符 | 说明 |
() | 分组 |
! ~ - | 一元运算符 |
* / % | 算数运算符 |
+ - | 算数运算符 |
<< >> | 逻辑移位 |
& | 按位“与” |
^ | 按位“异” |
| | 按位“或” |
= *= /= %= += -= | 赋值 |
&= ^= |= <<= >>= | 也是赋值 |
, (逗号) | 表达式分隔符 |
我们写个最简单的带括号的四则运算,遵循先乘除后加减,有括号则先运算括号内表达式:
C:\Windows\System32>set /a 3*3 + 4*4 # 加号两边有空格貌似并不影响
25
C:\Windows\System32>set /a 3*3+(3+1)*(2+2)
25
C:\Windows\System32>set /a 3*3+3+1*2+2
16
3、set 的 /p 命令行开关
我们先来看下 set /? 对 set /p 的说明,/P 命令行开关允许将变量数值设成用户输入的一行输入。读取输入行之前,显示指定的 promptString。promptString 可以是空的。我们来实操下:
C:\>set /p a=
123+234
C:\>set a
a=123+234
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Administrator\AppData\Roaming
结合上面的 /p 开关测试下:
C:\>set /a %a%
357
4、关于作业
1)使用 Windows 的命令写一个计算器,用于加减乘除的简单运算
要求:输入例如:1+1,输出结果为2;10行内写出,不允许叠加
1)实现程序基本功能
鉴于上面set /a 可以计算表达式 set /p 可以输入表达式,那么我们可以构造先用 /p 要求用户输入表达式,再用 /a 计算表达式的结果。简要的代码如下:
C:\>set /a %a%
357
C:\>echo 请输入表达式(例如:1+1):
请输入表达式(例如:1+1):
C:\>set /p a=
100*100
C:\>set /a %a%
10000
2)封装过程中产生的问题和解决思路
乱码问题
把上面的代码装在个 .bat 文件中,先运行下看看结果:
发生了乱码,大概率是编码的问题,我们另存为下这个 .bat 文件,看看编码是什么:
结果不回显问题
发现默认是 UTF-8 ,我们选择 ANSI 保持后再运行,中文的显示结果正常了,但是又出来了个新的问题,虽然在命令行中 set /a 可以计算并且回显表达式的计算结果,但是写在 .bat 文件中并不会直接回显:
我们如果 echo %a% 呢?实验下看看,结果也是有问题并不会计算结果,而且环境变量中 %a% 只不是是一个表达式,并没有计算出结果:
有没有可能表达式的计算结果需要另外再赋值给个环境变量呢?我们再操作下试试,这次我们需要修改 set /a 这条语句,把赋值的变量 %result% 加进去;运行下看看,ok,已经基本达到了我们的要求吗,完成了表达式的录入,计算求解,以及正确的回显的过程:
循环的问题
以上基本已经可以完成作业的要求,不过对于精益求精的我们来说,这个作业是有问题的。因为普通的计算器,一般都是可以循环输入得出结果,直至用户关闭程序再会停止。那么我们需要用到其他的方法来解决这个问题,利用 goto 。其实说实话,我们一般是不太喜欢利用这种无条件跳转的 goto 语句,因为严重破坏了程序的结构,不过在 cmd 的 bat 程序里,好像暂时找不到什么其他比较好的方法。改良后的代码和运行结果分别如下:
@echo on
:loop
echo 请输入表达式(例如:1+1):
set /p a=
set /a result=%a%
echo 结果result=%result%
pause
goto :loop
关于 /p 计算表达式的延伸思考
表达式如果是数字+数字的情况下是ok的,但是如果表达式是环境变量是否可行呢?我们来实操下看看。实验的结果,如果表达式中是2个存在的变量,会用变量的值来替换,如果是2个不存在的变量,则默认会认为都是0:
C:\Users\Administrator\Desktop>set t1=100
C:\Users\Administrator\Desktop>set t2=22
C:\Users\Administrator\Desktop>0.bat # 0.bat 是我代码的 .bat 程序
C:\Users\Administrator\Desktop>echo 请输入表达式(例如:1+1):
请输入表达式(例如:1+1):
C:\Users\Administrator\Desktop>set /p a=
t1+t2
C:\Users\Administrator\Desktop>if t1+t2 == "q" goto :end
C:\Users\Administrator\Desktop>set /a result=t1+t2
C:\Users\Administrator\Desktop>echo 结果result=122
结果result=122
C:\Users\Administrator\Desktop>pause
请按任意键继续. . .
终止批处理操作吗(Y/N)? y
C:\Users\Administrator\Desktop>set t
t1=100
t2=22
TEMP=C:\Users\ADMINI~1\AppData\Local\Temp
TMP=C:\Users\ADMINI~1\AppData\Local\Temp
C:\Users\Administrator\Desktop>set a
a=t1+t2
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Administrator\AppData\Roaming
=====下面是测试2个不存在的变量=====
C:\Users\Administrator\Desktop>0.bat
C:\Users\Administrator\Desktop>echo 请输入表达式(例如:1+1):
请输入表达式(例如:1+1):
C:\Users\Administrator\Desktop>set /p a=
a1+a2
C:\Users\Administrator\Desktop>if a1+a2 == "q" goto :end
C:\Users\Administrator\Desktop>set /a result=a1+a2
C:\Users\Administrator\Desktop>echo 结果result=0
结果result=0
C:\Users\Administrator\Desktop>pause
请按任意键继续. . .
跳出循环问题:
已经搞定循环的情况下,我们需要有个开关来跳出循环,否则只能 ctrl + c 来强制退出了,我们了解下 cmd 的 if 语句的说明,我们只需要了解其最简单的用法,和一个参数的特殊用途:
C:\Users\Administrator\Desktop>if /?
执行批处理程序中的条件处理。
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
而 /I 开关(如果指定)说明要进行的字符串比较不分大小写。
我们尝试下在 cmd 中写段代码,验证下 if 条件处理语句的使用方法,发现可以起到判断的作用:
C:\Users\Administrator\Desktop>set a=q
C:\Users\Administrator\Desktop>echo %a%
q
C:\Users\Administrator\Desktop>if %a%==q echo ok
ok
C:\Users\Administrator\Desktop>if /i %a%==Q echo ok
ok
C:\Users\Administrator\Desktop>
最终作业代码:
最后我们修改下代码如下,完成最终的作业:
@echo OFF
:loop
echo 请输入表达式(例如:1+1,输入q或者Q退出):
set /p a=
if /i %a%==q goto :end
set /a result=%a%
echo 结果result=%result%
pause
goto :loop
:end
然后再跑下代码:
C:\Users\Administrator\Desktop>0.bat
请输入表达式(例如:1+1,输入q或者Q退出):
1+1
结果result=2
请按任意键继续. . .
请输入表达式(例如:1+1,输入q或者Q退出):
2+2
结果result=4
请按任意键继续. . .
请输入表达式(例如:1+1,输入q或者Q退出):
q
C:\Users\Administrator\Desktop>0.bat
请输入表达式(例如:1+1,输入q或者Q退出):
100*100
结果result=10000
请按任意键继续. . .
请输入表达式(例如:1+1,输入q或者Q退出):
100/0
以零为除数的错误。
结果result=10000
请按任意键继续. . .
请输入表达式(例如:1+1,输入q或者Q退出):
Q
四、作业2分析
2)分析 Windows 课程中资源耗尽型病毒的原理
要求:发给管理员截图的静态分析,截图标注 bat 文件运行步骤
1、什么是资源耗尽型恶意代码
资源耗尽型恶意代码是一种设计用来消耗计算机系统资源的程序,它通过不断占用内存、CPU 时间、磁盘空间、网络带宽等关键资源,导致操作系统和其他正常运行的程序无法得到足够的资源来执行其任务,进而使系统性能严重下降甚至崩溃。这种恶意代码可能通过创建大量的进程或线程、无限循环地执行计算任务、大量读写磁盘文件、发送或接收大量网络数据等方式来实现其目的。最终,受害者的计算机系统将变得非常缓慢,甚至无法响应用户的指令,从而达到恶意代码制作者的目的,如破坏系统、窃取信息或进行勒索等。
2、免责声明
本节课程后续相关内容具有一定破坏性,请勿在物理机上操作,也请勿用于实战,请仅在实验环境 / 靶场环境中进行操作,建议只在自己已经做好镜像备份,并且里面没有任何重要资料的虚拟机中操作,虚拟机做好快照克隆镜像操作,玩坏了可以恢复。
3、关于批处理参数 %n
我们先来看下很简单的代码,了解下批处理命令参数的简单用法:
C:\Users\Administrator\Desktop>type test.bat
echo
echo %0
echo %1
echo %2
echo %3
echo %10
C:\Users\Administrator\Desktop>test 1 2 3 4 5 6 7 8 9 10 11
C:\Users\Administrator\Desktop>echo
ECHO 处于打开状态。
C:\Users\Administrator\Desktop>echo test
test
C:\Users\Administrator\Desktop>echo 1
1
C:\Users\Administrator\Desktop>echo 2
2
C:\Users\Administrator\Desktop>echo 3
3
C:\Users\Administrator\Desktop>echo 10
10
我们可以看到,%0是程序本身,%1 是第一个参数,%2 是第二个参数……%10 是第10个参数……,理论上可以有无穷个参数。但是核心问题是第0个参数 %0。
这里还有个小细节,如果 test.bat 执行的时候是使用命令 test.bat +参数,则echo %0 会变成 test.bat 。
C:\Users\Administrator\Desktop>test.bat
C:\Users\Administrator\Desktop>echo
ECHO 处于打开状态。
C:\Users\Administrator\Desktop>echo test.bat
test.bat
(下面省略了)
我们再尝试下,用 type 命令(其他命令也可以比如 dir 命令),再 .bat 程序中调用这个执行文件的本身,具体代码以及演示结果如下:
C:\Users\Administrator\Desktop>test 1 2
C:\Users\Administrator\Desktop>echo
ECHO 处于打开状态。
C:\Users\Administrator\Desktop>echo test
test
C:\Users\Administrator\Desktop>echo 1
1
C:\Users\Administrator\Desktop>type test # 上面说的细节问题,不写全文件是无法执行 type 的
系统找不到指定的文件。
C:\Users\Administrator\Desktop>test.bat 1 2
C:\Users\Administrator\Desktop>echo
ECHO 处于打开状态。
C:\Users\Administrator\Desktop>echo test.bat
test.bat
C:\Users\Administrator\Desktop>echo 1
1
C:\Users\Administrator\Desktop>type test.bat
echo
echo %0
echo %1
type %0
C:\Users\Administrator\Desktop>
4、首次尝试资源耗尽型恶意代码
我们把 type 去掉,只保留 0% ,这个时候发现屏幕开始快速滚动,按下 ctrl +c (不行就多按几次),程序开始中止等待后续操作指示,我们可以看到程序结束的时候,又开始执行程序本身。
我们修改下代码,%0 前面加上个 start ,注意和%0之间有个空格,我们再静态调试下,因为没有 debug 功能,我们把代码改成如下,增加 pause 作为断点调试:
echo
echo %0
echo %1
pause
start %0
我们可以看到,运行 test.bat 后遇到第一个 pause ,我们按了下任意键,就会新开个窗口,再去重复运行这个 test.bat,此后再按 2 次任意键,就会新开2个窗口,总计开了 4 个cmd窗口。现在我们只要关闭 4 个 cmd 窗口,系统就会恢复正常。如果我们去掉 pause 会如何呢?我在后面放了视频:
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="GkAzC3oQ-1733816262361" src="https://player.bilibili.com/player.html?aid=113627352797424"></iframe>资源耗尽型恶意代码的特征
5、该类资源耗尽型恶意代码的简单防护
我们回到带 pause 有断点调试的代码中来,再 pause 过程中将整个 .bat 文件删除或改个名字会如何?经过下面的实验我们可以看到,如果在 pause 过程中,将程序改名(效果等同于删除),后面的 start %0 就会因为找不到原文件而无法继续运行下去。
接下来,我们编写个很简单的防护程序,5秒后将带有恶意代码的 test.bat 文件改名,这样让这个资源耗尽型恶意代码失效。整个程序的代码是下面这样的,利用了 ping 1秒 ping 一次的机制,来做了个简单的定时。注意,一定要先运行这个定时+改名简单的防护程序再启动恶意代码。
ping -n 5 127.0.0.1
move test.bat test1.bat
做了个简单的视频,供大家参考下。
<iframe allowfullscreen="true" data-mediaembed="bilibili" frameborder="0" id="n9xmCA8n-1733816947946" src="https://player.bilibili.com/player.html?aid=113627403129268"></iframe>资源耗尽型恶意代码简单防护
另外在实际生活或者工作中,大家如果正常安装了杀毒软件一般也不用太担心,这种恶意代码也会被杀软扫出来,下图的火绒就提示该类文件有风险项,提示是玩笑程序。
6、资源耗尽型恶意代码的改进
由于上述资源耗尽型恶意代码利用重复打开 cmd.exe ,因为 cmd.exe 本身大小并不是很大,我们可以查看下它的大小,只有 350k 不到:
C:\Users\Administrator\Desktop> where cmd
C:\Windows\System32\cmd.exe
C:\Users\Administrator\Desktop>dir C:\Windows\System32\cmd.exe
驱动器 C 中的卷没有标签。
卷的序列号是 DE11-8DB0
C:\Windows\System32 的目录
2012/07/26 11:20 349,696 cmd.exe
1 个文件 349,696 字节
0 个目录 52,962,193,408 可用字节
有没有什么更快得耗尽程序内存资源的方法?我目前能想到的是让 windows 打开一张超级大的图片,代码是下面这样,不过先要关联好让 windows 用照片查看器或者 默认浏览器 打开照片,后续执行 start xx.bmp 时,系统会自动用预设的程序(ie 或者 照片查看器)来重复打开图片:
@echo off
start 1.bmp
start %0
7、其他资源耗尽型恶意代码
上文中资源耗尽型恶意代码均是耗尽了系统的内存,除了耗尽系统内存以外,还有耗尽系统的CPU、硬盘、带宽。CPU的话比较好解决,我们可以利用一些很复杂的运算,比如1乘2乘3一直乘下去,注意不要超过 Windows 批处理的数字区间,-2,147,483,648 到 2,147,483,647 之间;硬盘耗尽型恶意代码,我们可以多次复制一些大文件,带宽耗尽型恶意代码我们可以找网上的测速网站,具体不再赘述了。
标签:Administrator,set,Users,--,恶意代码,echo,Windows,Desktop From: https://blog.csdn.net/grrrr_1/article/details/144308603